From eb38aa57a5706e650336ade56f6ceac4863bdcc6 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Mon, 20 Apr 2026 09:48:51 +0200 Subject: [PATCH] Add .1pux import unit test (#1937) --- .../AliasVault.UnitTests.csproj | 1 + .../TestData/Exports/test_export.1pux | Bin 0 -> 2210 bytes .../Utilities/ImportExportTests.cs | 127 ++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 apps/server/Tests/AliasVault.UnitTests/TestData/Exports/test_export.1pux diff --git a/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj b/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj index 5883a77bb..6b718133e 100644 --- a/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj +++ b/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj @@ -70,6 +70,7 @@ + diff --git a/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/test_export.1pux b/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/test_export.1pux new file mode 100644 index 0000000000000000000000000000000000000000..fd4cf485e2e8b60c856c4f3ba00f90093cd53792 GIT binary patch literal 2210 zcmaKuc{p2n7sqc9`_fp8Fly{dY8z^*ipG*yLM$z@i#0`?q?TZes!|=*L8w@YzG7FZ zJft;tRcp0M8LC>_kSbHV@`k>{ytDM)=iKLap67SIzwbSNoX-!1WM&Zr0Dv7x3rxmj zIu+U3F)~+1KmaI!4Gj*uLQr)l5U%)n5D8ekoh=8zoX|Vzm(B=cC>H=?Sp@;Wfkf$y z4GN`%R8i{d=|@-FoO%UXM%yH&B&u^Eq&yIDpoI4J=}ovIXI@xwSQk7EEL*I|Ss?`8 zgv%n_c)H-l3Fp*0`R`pZLUW-#Jw4GH$O=bQ0CniEh~aO(POt7R7yx(_0f6hspO-tq z{lHln!_|KL#o4r@bI{m#f|31|lb;??<*Kl!EtmuY$hU{+nW7J$R2+|qA^TD&jpwW_ zA4~5=rr&>WDvVVm>-Hc~nnGcwE)&Qc5@KZmWXM`ems$(+$|}&G6wj+%39@cIEzs`Q zEU+O=Vo|!KmY~ys!giF(XXKXWo{z;UFZ1Jj&J$}>Lo*uklZ_~K??I$IWYS_&cg$3V zZuOgm=NnTiE9qVIP<2rZvDZa-nq?pz7R=SxI=8bi;v_*dg2LB9`184)#xYUm6j3CU zCMxeGVLf##3tqjMx1r0;k;wE7O*AF-qD(cIaKWZ>71@`KRoPUsT{SM;QR7lqkavl? zO3~=CFlpi&ce9MtqJHQ|2D0ByH-$W9ZlYaBP#`@C_+~iWY*@YDvVTh+d;zK}dZF^o zL(7w;uF-HPs^ugO-yj2b!WHGR;k3+pmI#`xY{(XJ>aQX(MIG_ftSb(@zf%PS*&s9O zb#q2fr(37d-er3*9vyQ8AQNqh7?>fAm6C)@@ z4A2P#qp5mAGDw^bdnZ)(EsXnkXA^IT_*|!91hnNxrkf;l`)7|rjS?2lXfPocJH}#^ z4E%>uhYH7FtkNlas?EKzVehGGWt zh1vW*<$intmZb6dzV0zTDKz(Z?7V(OGDg}|xB%=vDglK!UHI6eRWo7s4YTn;Q!cm% ztx+62ZpyO`wxX-JXIyf6HSIlZv7I&&Gig8PC};B-Rh@8C7x~fEROqbp#c6xfo8B*T zeZG%!GVu7#gw~dFc2>=s7xJp_f%qL2Q@)>J#9}Ldx9p}_eMs)9G_=fP7H5AVn&dnGR`U+9PqOSQlpchuVqSoBkP*X5So*_gek`1=My6MH&apXx)j9!F{K42bWZ z-N`YwHXos|&??^!l7r+V^=vv%DVjVffUsSz@|@tn$p6Qq^aq;`P!^&CDEC?e*0ySL zhA3uQ>rWtMbdUbH$)V@r*K2;sTkT2ODjo>uC@X@741{|Nl&_2b^gtDT=JGBl2X{kT zJ8sn+l45ny$XJg%mS-2QU?L5?k-`pHSj)B|ampMB?g!Dm=Z=p`=X;3@jZj%tys7KW zEhY}l6E>KXTkkt32s90W&ar6RBK}cXdqut7JHvi^?Y$S8oLTML!Yop9x&^hVw~MZx zCwI>*vqwDsQyhAdB1Y21l<^IM@M4KoUQd!I^Tg$nHxg7slM3LJWGe&0`tsXX!oK8%iTRXk1 zyo)c0kOVc?&VCS|diz;#%5Q2(5gTER{%nR5sv*xxXqBe8)QyQyB}u<+?8Qk#=Bs(M z21`Q_LjlXFC80ZS$YR#(dUL`NFG|EjVZO1Ge8zXg3~UQXZUHro!`+;z1ub(lwo#5n z`zeeSam~>-yZzevp6;}qV+K|AGLbs`U5e1cpKcra6v~bg*O}*?H;;>5eLcfdx0D zMwSt-<~!fR3}R<*k4ExJ+w+NWZoP8ewimlcQxIs>SEKEML}ok18)I9W$Rj zweaHMl1tMzZ@q8I@QsxYb0{X-r92rLj?jNfj<2L$>%8{E!F1|^IIgMFV4NA=Z@ZWJD8)bGcM!+NhEPc?N7S696IrC=OZg^?03VFL-O z!Cu~9lSUtGm-=J7lxI*NflvFz<`cqvq_p`Qu?dXwiOl44@lCu>yy!{+hWXt^aTIpUpKMYJIis W|8@+RQO>wcFkUA{57pTAv;P7lU535@ literal 0 HcmV?d00001 diff --git a/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs b/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs index bcfa6d6c5..354c239fc 100644 --- a/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs +++ b/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs @@ -1958,4 +1958,131 @@ public class ImportExportTests return item; } + + /// + /// Test case for importing credentials from 1Password .1pux export format. + /// + /// Async task. + [Test] + public async Task ImportCredentialsFromOnePassword1pux() + { + // Arrange + var zipBytes = await ResourceReaderUtility.ReadEmbeddedResourceBytesAsync("AliasVault.UnitTests.TestData.Exports.test_export.1pux"); + + // Act + var importer = new OnePassword1puxImporter(); + var importedCredentials = await importer.ImportFromArchiveAsync(zipBytes); + + // Assert + Assert.That(importedCredentials, Has.Count.EqualTo(6)); + + // Test Login item with TOTP and custom fields + var loginItem = importedCredentials.First(c => c.ServiceName == "Example Login"); + Assert.Multiple(() => + { + Assert.That(loginItem.ServiceName, Is.EqualTo("Example Login")); + Assert.That(loginItem.Username, Is.EqualTo("jdoe")); + Assert.That(loginItem.Password, Is.EqualTo("mySecurePassword123")); + Assert.That(loginItem.ServiceUrls, Has.Count.EqualTo(1)); + Assert.That(loginItem.ServiceUrls![0], Is.EqualTo("https://example.com")); + Assert.That(loginItem.TwoFactorSecret, Is.EqualTo("otpauth://totp/Example:jdoe?secret=JBSWY3DPEHPK3PXP&issuer=Example")); + Assert.That(loginItem.Notes, Is.EqualTo("My login notes here")); + Assert.That(loginItem.FolderPath, Is.EqualTo("Personal")); + Assert.That(loginItem.ItemType, Is.EqualTo(ImportedItemType.Login)); + Assert.That(loginItem.Tags, Has.Count.EqualTo(2)); + Assert.That(loginItem.Tags, Does.Contain("work")); + Assert.That(loginItem.Tags, Does.Contain("important")); + Assert.That(loginItem.CustomFields, Is.Not.Null); + Assert.That(loginItem.CustomFields!["Recovery Email"], Is.EqualTo("recovery@example.com")); + }); + + // Verify created/updated timestamps are converted from Unix time + var expectedCreatedDate = DateTimeOffset.FromUnixTimeSeconds(1614298956).UtcDateTime; + var expectedUpdatedDate = DateTimeOffset.FromUnixTimeSeconds(1635346445).UtcDateTime; + Assert.Multiple(() => + { + Assert.That(loginItem.CreatedAt, Is.EqualTo(expectedCreatedDate)); + Assert.That(loginItem.UpdatedAt, Is.EqualTo(expectedUpdatedDate)); + }); + + // Test Credit Card item + var cardItem = importedCredentials.First(c => c.ServiceName == "My Visa Card"); + Assert.Multiple(() => + { + Assert.That(cardItem.ServiceName, Is.EqualTo("My Visa Card")); + Assert.That(cardItem.Notes, Is.EqualTo("Primary credit card")); + Assert.That(cardItem.FolderPath, Is.EqualTo("Personal")); + Assert.That(cardItem.ItemType, Is.EqualTo(ImportedItemType.Creditcard)); + Assert.That(cardItem.Creditcard, Is.Not.Null); + Assert.That(cardItem.Creditcard!.CardholderName, Is.EqualTo("John Doe")); + Assert.That(cardItem.Creditcard.Number, Is.EqualTo("4111111111111111")); + Assert.That(cardItem.Creditcard.Cvv, Is.EqualTo("123")); + Assert.That(cardItem.Creditcard.Pin, Is.EqualTo("1234")); + Assert.That(cardItem.Creditcard.ExpiryYear, Is.EqualTo("2025")); + Assert.That(cardItem.Creditcard.ExpiryMonth, Is.EqualTo("12")); + }); + + // Test Identity item + var identityItem = importedCredentials.First(c => c.ServiceName == "My Identity"); + Assert.Multiple(() => + { + Assert.That(identityItem.ServiceName, Is.EqualTo("My Identity")); + Assert.That(identityItem.ItemType, Is.EqualTo(ImportedItemType.Alias)); + Assert.That(identityItem.Alias, Is.Not.Null); + Assert.That(identityItem.Alias!.FirstName, Is.EqualTo("Jane")); + Assert.That(identityItem.Alias.LastName, Is.EqualTo("Smith")); + Assert.That(identityItem.Alias.Gender, Is.EqualTo("Female")); + Assert.That(identityItem.Alias.BirthDate, Is.Not.Null); + var expectedBirthDate = DateTimeOffset.FromUnixTimeSeconds(631152000).UtcDateTime; + Assert.That(identityItem.Alias.BirthDate, Is.EqualTo(expectedBirthDate)); + }); + + // Test Secure Note item + var noteItem = importedCredentials.First(c => c.ServiceName == "Secure Note"); + Assert.Multiple(() => + { + Assert.That(noteItem.ServiceName, Is.EqualTo("Secure Note")); + Assert.That(noteItem.Notes, Is.EqualTo("This is a secure note with important information.")); + Assert.That(noteItem.ItemType, Is.EqualTo(ImportedItemType.Note)); + }); + + // Test Login from Work vault + var workLoginItem = importedCredentials.First(c => c.ServiceName == "Work Portal"); + Assert.Multiple(() => + { + Assert.That(workLoginItem.ServiceName, Is.EqualTo("Work Portal")); + Assert.That(workLoginItem.Username, Is.EqualTo("admin")); + Assert.That(workLoginItem.Password, Is.EqualTo("WorkPassword789!")); + Assert.That(workLoginItem.FolderPath, Is.EqualTo("Work")); + Assert.That(workLoginItem.ItemType, Is.EqualTo(ImportedItemType.Login)); + }); + + // Test Document item with attachment + var docItem = importedCredentials.First(c => c.ServiceName == "Sample Document"); + Assert.Multiple(() => + { + Assert.That(docItem.ServiceName, Is.EqualTo("Sample Document")); + Assert.That(docItem.Notes, Is.EqualTo("Test document with attachment")); + Assert.That(docItem.FolderPath, Is.EqualTo("Personal")); + Assert.That(docItem.ItemType, Is.EqualTo(ImportedItemType.Note)); + Assert.That(docItem.Attachments, Is.Not.Null); + Assert.That(docItem.Attachments, Has.Count.EqualTo(1)); + Assert.That(docItem.Attachments![0].Filename, Is.EqualTo("sample-document.pdf")); + Assert.That(docItem.Attachments[0].Blob, Is.Not.Empty); + var attachmentContent = System.Text.Encoding.UTF8.GetString(docItem.Attachments[0].Blob!); + Assert.That(attachmentContent, Does.Contain("Sample document content")); + }); + + // Verify conversion to Item works correctly + var convertedItems = BaseImporter.ConvertToItem(importedCredentials); + Assert.That(convertedItems, Has.Count.EqualTo(6)); + + var convertedLogin = convertedItems.First(i => i.Name == "Example Login"); + Assert.Multiple(() => + { + Assert.That(convertedLogin.ItemType, Is.EqualTo(ItemType.Login)); + Assert.That(convertedLogin.TotpCodes, Has.Count.EqualTo(1)); + Assert.That(convertedLogin.TotpCodes.First().SecretKey, Is.EqualTo("JBSWY3DPEHPK3PXP")); + }); + } }