From dc769bb5d4610dec20568dfc00bb2413cf6ecef0 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Mon, 24 Mar 2025 17:19:05 +0100 Subject: [PATCH] Adjust UnitTests namespace, add CSV importer unit tests (#542) --- .../AliasVault.E2ETests.csproj | 1 + src/Tests/AliasVault.E2ETests/GlobalUsings.cs | 3 +- .../AliasVault.E2ETests/TestData/README.md | 2 +- .../AliasVault.UnitTests.csproj | 9 ++- .../Common/ResourceReaderUtility.cs | 2 +- .../Generators/IdentityGeneratorTest.cs | 2 +- .../TestData/Exports/bitwarden.csv | 6 ++ .../TestData/Exports/keepass.kdbx.csv | 10 +++ .../AliasVault.UnitTests/TestData/README.md | 6 ++ .../Utilities/ConversionUtilityTest.cs | 2 +- .../Utilities/FaviconExtractorTests.cs | 2 +- .../Utilities/ImportExportTests.cs | 77 ++++++++++++++++++- .../Utilities/RsaEncryptionTests.cs | 2 +- .../Utilities/SrpArgonEncryptionTests.cs | 2 +- .../Utilities/TotpGeneratorTests.cs | 2 +- .../Vault/FilesizeTests.cs | 2 +- .../RetentionManager/GeneralRetentionTests.cs | 2 +- .../Vault/VersionTests.cs | 2 +- 18 files changed, 120 insertions(+), 14 deletions(-) rename src/Tests/{AliasVault.E2ETests => AliasVault.UnitTests}/Common/ResourceReaderUtility.cs (98%) create mode 100644 src/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv create mode 100644 src/Tests/AliasVault.UnitTests/TestData/Exports/keepass.kdbx.csv create mode 100644 src/Tests/AliasVault.UnitTests/TestData/README.md diff --git a/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj b/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj index 0380df815..c200a42a8 100644 --- a/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj +++ b/src/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj @@ -53,6 +53,7 @@ + diff --git a/src/Tests/AliasVault.E2ETests/GlobalUsings.cs b/src/Tests/AliasVault.E2ETests/GlobalUsings.cs index 46f3d3f5f..daf329076 100644 --- a/src/Tests/AliasVault.E2ETests/GlobalUsings.cs +++ b/src/Tests/AliasVault.E2ETests/GlobalUsings.cs @@ -7,7 +7,8 @@ // global using System.Threading.Tasks; -global using NUnit.Framework; global using AliasVault.E2ETests.Infrastructure; global using AliasVault.E2ETests.Common; +global using AliasVault.UnitTests.Common; +global using NUnit.Framework; global using Microsoft.Playwright; diff --git a/src/Tests/AliasVault.E2ETests/TestData/README.md b/src/Tests/AliasVault.E2ETests/TestData/README.md index e8feb543b..f252c8863 100644 --- a/src/Tests/AliasVault.E2ETests/TestData/README.md +++ b/src/Tests/AliasVault.E2ETests/TestData/README.md @@ -1,6 +1,6 @@ This folder contains test data for the AliasVault.E2ETests project. The build action of these is set to "Embedded resource" so that they can be accessed by the tests -using the `ResourceReaderUtility` class. +using the `AliasVault.UnitTests.ResourceReaderUtility` class. Index: - `AliasClientDb_encrypted_base64_1.0.0` - Encrypted vault blob with client db version 1.0.0 used to test client db upgrade paths. This vault contains two test credentials that are checked in the tests after local client db upgrade. diff --git a/src/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj b/src/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj index 431bb546d..b220bfae8 100644 --- a/src/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj +++ b/src/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj @@ -6,7 +6,7 @@ enable false true - AliasVault.Tests + AliasVault.UnitTests 13 @@ -60,4 +60,11 @@ + + + + + + + diff --git a/src/Tests/AliasVault.E2ETests/Common/ResourceReaderUtility.cs b/src/Tests/AliasVault.UnitTests/Common/ResourceReaderUtility.cs similarity index 98% rename from src/Tests/AliasVault.E2ETests/Common/ResourceReaderUtility.cs rename to src/Tests/AliasVault.UnitTests/Common/ResourceReaderUtility.cs index ef477aac0..9f10b51ad 100644 --- a/src/Tests/AliasVault.E2ETests/Common/ResourceReaderUtility.cs +++ b/src/Tests/AliasVault.UnitTests/Common/ResourceReaderUtility.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.E2ETests.Common; +namespace AliasVault.UnitTests.Common; using System.IO; using System.Reflection; diff --git a/src/Tests/AliasVault.UnitTests/Generators/IdentityGeneratorTest.cs b/src/Tests/AliasVault.UnitTests/Generators/IdentityGeneratorTest.cs index 444cfd9c9..895a109bb 100644 --- a/src/Tests/AliasVault.UnitTests/Generators/IdentityGeneratorTest.cs +++ b/src/Tests/AliasVault.UnitTests/Generators/IdentityGeneratorTest.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Generators; +namespace AliasVault.UnitTests.Generators; using System.Net.Mail; using AliasVault.Generators.Identity.Implementations.Factories; diff --git a/src/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv b/src/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv new file mode 100644 index 000000000..b43c15745 --- /dev/null +++ b/src/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv @@ -0,0 +1,6 @@ +folder,favorite,type,name,notes,fields,reprompt,login_uri,login_username,login_password,login_totp +Business,,login,Item for business folder,,,0,,crisply,4CSp43uhSZri8A, +,,login,Test,,,0,,,, +,,login,Test,,,0,,test2,asdasd, +Business,,login,TutaNota,,,0,,avtest2@tutamail.com,blabla,otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30 +Business,,login,Aliasvault.net,,,0,https://www.aliasvault.net,root,toor, diff --git a/src/Tests/AliasVault.UnitTests/TestData/Exports/keepass.kdbx.csv b/src/Tests/AliasVault.UnitTests/TestData/Exports/keepass.kdbx.csv new file mode 100644 index 000000000..ee327230c --- /dev/null +++ b/src/Tests/AliasVault.UnitTests/TestData/Exports/keepass.kdbx.csv @@ -0,0 +1,10 @@ +Title,Username,Email,Password,URL,OTPAuth,Notes +Sample,username,,&3V_$z?Aiw-_x+nbYj,https://strongboxsafe.com,, +Business1,username,,NYVqE8MpfnX#r+ukpE,,, +Business 2,username,,+jeN9dTLy4Ahh-C3fB,,, +Prive 1,username,,4c*Ksh??7Q_K#xKMLh,,, +Prive 2,username,,Ld6JsF^JXR7^8_F#Ad,,, +TutaNota,avtest2@tutamail.com,,blabla,,otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30,"Recovery code for main account: e45f a053 8b7e 127c 302b a816 abc2 739a 9b0c 7393 6adc 123a ff4e 084d 7798 ef26 + +Recovery code for 2FA: +e45f a053 8b7e 127c 302b a816 abc2 739a 9b0c 7393 6adc 123a ff4e 084d 7798 ef26" diff --git a/src/Tests/AliasVault.UnitTests/TestData/README.md b/src/Tests/AliasVault.UnitTests/TestData/README.md new file mode 100644 index 000000000..955e78cb9 --- /dev/null +++ b/src/Tests/AliasVault.UnitTests/TestData/README.md @@ -0,0 +1,6 @@ +This folder contains test data for the AliasVault.UnitTests project. +The build action of these is set to "Embedded resource" so that they can be accessed by the tests +using the `ResourceReaderUtility` class. + +Index: +- `Exports` Folder that contains export samples from other password managers to be used in import tests. diff --git a/src/Tests/AliasVault.UnitTests/Utilities/ConversionUtilityTest.cs b/src/Tests/AliasVault.UnitTests/Utilities/ConversionUtilityTest.cs index abafaef14..0b918d486 100644 --- a/src/Tests/AliasVault.UnitTests/Utilities/ConversionUtilityTest.cs +++ b/src/Tests/AliasVault.UnitTests/Utilities/ConversionUtilityTest.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Utilities; +namespace AliasVault.UnitTests.Utilities; using System.Text.RegularExpressions; using AliasVault.Shared.Utilities; diff --git a/src/Tests/AliasVault.UnitTests/Utilities/FaviconExtractorTests.cs b/src/Tests/AliasVault.UnitTests/Utilities/FaviconExtractorTests.cs index 0076d1a0d..66d3a44bd 100644 --- a/src/Tests/AliasVault.UnitTests/Utilities/FaviconExtractorTests.cs +++ b/src/Tests/AliasVault.UnitTests/Utilities/FaviconExtractorTests.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Utilities; +namespace AliasVault.UnitTests.Utilities; /// /// Tests for the AliasVault.FaviconExtractor class. diff --git a/src/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs b/src/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs index cd6106ec7..edd317b3d 100644 --- a/src/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs +++ b/src/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs @@ -5,10 +5,12 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Utilities; +namespace AliasVault.UnitTests.Utilities; using AliasClientDb; using AliasVault.ImportExport; +using AliasVault.ImportExport.Importers; +using AliasVault.UnitTests.Common; /// /// Tests for the AliasVault.ImportExport class. @@ -102,4 +104,77 @@ public class ImportExportTests Assert.That(importedPassword.UpdatedAt.ToString("yyyy-MM-dd"), Is.EqualTo(originalPassword.UpdatedAt.ToString("yyyy-MM-dd"))); }); } + + /// + /// Test case for importing credentials from Bitwarden CSV and ensuring all values are present. + /// + /// Async task. + [Test] + public async Task ImportCredentialsFromBitwardenCsv() + { + // Arrange + var fileContent = await ResourceReaderUtility.ReadEmbeddedResourceStringAsync("AliasVault.UnitTests.TestData.Exports.bitwarden.csv"); + + // Act + var importedCredentials = await BitwardenImporter.ImportFromCsvAsync(fileContent); + + // Assert + Assert.That(importedCredentials, Has.Count.EqualTo(5)); + + // Test specific entries + var tutaNotaCredential = importedCredentials.First(c => c.ServiceName == "TutaNota"); + Assert.Multiple(() => + { + Assert.That(tutaNotaCredential.ServiceName, Is.EqualTo("TutaNota")); + Assert.That(tutaNotaCredential.Username, Is.EqualTo("avtest2@tutamail.com")); + Assert.That(tutaNotaCredential.Password, Is.EqualTo("blabla")); + Assert.That(tutaNotaCredential.TwoFactorSecret, Is.EqualTo("otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30")); + }); + + var aliasVaultCredential = importedCredentials.First(c => c.ServiceName == "Aliasvault.net"); + Assert.Multiple(() => + { + Assert.That(aliasVaultCredential.ServiceName, Is.EqualTo("Aliasvault.net")); + Assert.That(aliasVaultCredential.ServiceUrl, Is.EqualTo("https://www.aliasvault.net")); + Assert.That(aliasVaultCredential.Username, Is.EqualTo("root")); + Assert.That(aliasVaultCredential.Password, Is.EqualTo("toor")); + }); + } + + /// + /// Test case for importing credentials from KeePass CSV and ensuring all values are present. + /// + /// Async task. + [Test] + public async Task ImportCredentialsFromKeePassCsv() + { + // Arrange + var fileContent = await ResourceReaderUtility.ReadEmbeddedResourceStringAsync("AliasVault.UnitTests.TestData.Exports.keepass.kdbx.csv"); + + // Act + var importedCredentials = await KeePassImporter.ImportFromCsvAsync(fileContent); + + // Assert + Assert.That(importedCredentials, Has.Count.EqualTo(6)); + + // Test specific entries + var tutaNotaCredential = importedCredentials.First(c => c.ServiceName == "TutaNota"); + Assert.Multiple(() => + { + Assert.That(tutaNotaCredential.ServiceName, Is.EqualTo("TutaNota")); + Assert.That(tutaNotaCredential.Username, Is.EqualTo("avtest2@tutamail.com")); + Assert.That(tutaNotaCredential.Password, Is.EqualTo("blabla")); + Assert.That(tutaNotaCredential.TwoFactorSecret, Is.EqualTo("otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30")); + Assert.That(tutaNotaCredential.Notes, Does.Contain("Recovery code for main account")); + }); + + var sampleCredential = importedCredentials.First(c => c.ServiceName == "Sample"); + Assert.Multiple(() => + { + Assert.That(sampleCredential.ServiceName, Is.EqualTo("Sample")); + Assert.That(sampleCredential.ServiceUrl, Is.EqualTo("https://strongboxsafe.com")); + Assert.That(sampleCredential.Username, Is.EqualTo("username")); + Assert.That(sampleCredential.Password, Is.EqualTo("&3V_$z?Aiw-_x+nbYj")); + }); + } } diff --git a/src/Tests/AliasVault.UnitTests/Utilities/RsaEncryptionTests.cs b/src/Tests/AliasVault.UnitTests/Utilities/RsaEncryptionTests.cs index a9547216d..fb0b3ffa2 100644 --- a/src/Tests/AliasVault.UnitTests/Utilities/RsaEncryptionTests.cs +++ b/src/Tests/AliasVault.UnitTests/Utilities/RsaEncryptionTests.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Utilities; +namespace AliasVault.UnitTests.Utilities; using System.Text.Json; using AliasVault.Cryptography.Server; diff --git a/src/Tests/AliasVault.UnitTests/Utilities/SrpArgonEncryptionTests.cs b/src/Tests/AliasVault.UnitTests/Utilities/SrpArgonEncryptionTests.cs index 516506296..2947a55ea 100644 --- a/src/Tests/AliasVault.UnitTests/Utilities/SrpArgonEncryptionTests.cs +++ b/src/Tests/AliasVault.UnitTests/Utilities/SrpArgonEncryptionTests.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Utilities; +namespace AliasVault.UnitTests.Utilities; using System.Security.Cryptography; using AliasVault.Cryptography.Client; diff --git a/src/Tests/AliasVault.UnitTests/Utilities/TotpGeneratorTests.cs b/src/Tests/AliasVault.UnitTests/Utilities/TotpGeneratorTests.cs index b276f3520..3aa159a00 100644 --- a/src/Tests/AliasVault.UnitTests/Utilities/TotpGeneratorTests.cs +++ b/src/Tests/AliasVault.UnitTests/Utilities/TotpGeneratorTests.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Utilities; +namespace AliasVault.UnitTests.Utilities; /// /// Tests for the TotpGeneratorTests class. diff --git a/src/Tests/AliasVault.UnitTests/Vault/FilesizeTests.cs b/src/Tests/AliasVault.UnitTests/Vault/FilesizeTests.cs index bd95a59a3..4c10fd2b1 100644 --- a/src/Tests/AliasVault.UnitTests/Vault/FilesizeTests.cs +++ b/src/Tests/AliasVault.UnitTests/Vault/FilesizeTests.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Vault; +namespace AliasVault.UnitTests.Vault; using AliasVault.Api.Helpers; diff --git a/src/Tests/AliasVault.UnitTests/Vault/RetentionManager/GeneralRetentionTests.cs b/src/Tests/AliasVault.UnitTests/Vault/RetentionManager/GeneralRetentionTests.cs index 63bf88d4a..ebd871fb7 100644 --- a/src/Tests/AliasVault.UnitTests/Vault/RetentionManager/GeneralRetentionTests.cs +++ b/src/Tests/AliasVault.UnitTests/Vault/RetentionManager/GeneralRetentionTests.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Vault.RetentionManager; +namespace AliasVault.UnitTests.Vault.RetentionManager; using AliasServerDb; using AliasVault.Api.Vault; diff --git a/src/Tests/AliasVault.UnitTests/Vault/VersionTests.cs b/src/Tests/AliasVault.UnitTests/Vault/VersionTests.cs index 45e67aaea..0c8a820dd 100644 --- a/src/Tests/AliasVault.UnitTests/Vault/VersionTests.cs +++ b/src/Tests/AliasVault.UnitTests/Vault/VersionTests.cs @@ -5,7 +5,7 @@ // //----------------------------------------------------------------------- -namespace AliasVault.Tests.Vault; +namespace AliasVault.UnitTests.Vault; using AliasVault.Api.Helpers;