test_signer.cpython-314-pytest-8.4.2.pyc raw

   1  +
   2  Di&cRt^RIt^RIHuHt^RIt^RIt^RI	H
   3  t
   4  !RR4t!RR4t!RR4t
!R	R
   5  4t!RR4tR#)
uDSigner extension tests — vault, identities, NIP-07, modal overlay.N)Byc6a]tRt^	toRtRtRtRtRtVt	R#)TestExtensionInstallz,Extension installs and injects window.nostr.cVPpRqC!V4qU'gRRR\P!49g\P!V4'd\P
   6  !V4MRR\P
   7  !V4R\P
   8  !V4R\P
   9  !V4/,p\
\P!V44hR;p;rER#)	z*Extension UUID was extracted successfully.zmoz-extension://zLassert %(py6)s
  10  {%(py6)s = %(py2)s
  11  {%(py2)s = %(py0)s.startswith
  12  }(%(py4)s)
  13  }py0extpy2py4py6N)
  14  startswith@py_builtinslocals
  15  @pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation)selfrelayr@py_assert1@py_assert3@py_assert5@py_format7s&&&    )/home/mleku/src/smesh/test/test_signer.pytest_extension_loaded*TestExtensionInstall.test_extension_loadedsz~~101~0111111111s1111s111~111011111111111c	VPVR,4\P!^4VPqU!4qf'g\P
  16  !R4R,RR\P!49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p\\P!V44hR;rVR#)	zAAfter extension install, window.nostr is present on the app page.urlzwindow.nostr not foundzF
  17  >assert %(py4)s
  18  {%(py4)s = %(py2)s
  19  {%(py2)s = %(py0)s.has_nostr
  20  }()
  21  }rhrrN)gettimesleep	has_nostrr
_format_assertmsgrrrrrrrrbrowserrrrr@py_format5s&&&&&   rtest_window_nostr&TestExtensionInstall.test_window_nostrsE%L!
  22  
  23  1
{{6{}6}6666666666q6666q666{666}666666rc	VPVR,4\P!^4VPqU!4qf'g\P
  24  !R4R,RR\P!49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p\\P!V44hR;rVR#)	z)The smesh management API is also present.rzwindow.nostr.smesh not foundzF
  25  >assert %(py4)s
  26  {%(py4)s = %(py2)s
  27  {%(py2)s = %(py0)s.has_smesh
  28  }()
  29  }rrrrN)rr r!	has_smeshr
r#rrrrrrr$s&&&&&   rtest_window_nostr_smesh,TestExtensionInstall.test_window_nostr_smeshsE%L!
  30  
  31  1
{{<{}<}<<<<<<<<<<q<<<<q<<<{<<<}<<<<<<rN)
  32  __name__
  33  __module____qualname____firstlineno____doc__rr'r+__static_attributes____classdictcell__
__classdict__s@rrr	s627==rrcHa]tRt^toRtRtRtRtRtRt	Rt
  34  RtVtR	#)
  35  TestVaultLifecycleu'Create vault → lock → unlock cycle.c@VPVR,4\P!^4VP4pRqeV8Hqw'g\P
  36  !RV3RWV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,p\P!RVR24R,R	V/,p	\\P!V	44hR
  37  ;rvR
  38  #)
z,Fresh extension reports vault status 'none'.rnonerstatuspy3zexpected 'none', got ''
  39  >assert %(py5)spy5N==z%(py0)s == %(py3)s
rr r!vault_statusr
_call_reprcomparerrrrr#rr
  40  rrr%rrr;@py_assert2r@py_format4@py_format6s
  41  &&&&&     rtest_vault_status_none)TestVaultLifecycle.test_vault_status_none sE%L!
  42  
  43  1
!CCCCCvCCCCCCvCCCCvCCCCCCC#9&!CCCCCCCCCrc<VPVR,4\P!^4VPR^R7pRqeVJqw'g\P
  44  !RV3R
WV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,p\P!R4R	,R
  45  V/,p	\\P!V	44hR;rvR#)z$Create a vault with a test password.rz
  46              var cb = arguments[arguments.length - 1];
  47              window.nostr.smesh.createVault('testpass123')
  48                  .then(function(ok) { cb(ok); })
  49                  .catch(function(e) { cb(false); });
  50          timeoutTrresultr<zcreateVault returned falser>r?Nisz%(py0)s is %(py3)s
rr r!js_asyncr
rErrrrr#rr
  51  rrr%rrrOrGrrHrIs
  52  &&&&&     rtest_create_vault$TestVaultLifecycle.test_create_vault'sE%L!
  53  
  54  1

  55  ;~;;;;v;;;;;;v;;;;v;;;;;;;;;;;;;;;;rc@VPVR,4\P!^4VP4pRqeV8Hqw'g\P
  56  !RV3RWV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,p\P!RVR24R,R	V/,p	\\P!V	44hR
  57  ;rvR
  58  #)
z"After creation, vault is unlocked.runlockedrr;r<zexpected 'unlocked', got 'r=r>r?Nr@rBrCrFs
  59  &&&&&     rtest_vault_status_unlocked-TestVaultLifecycle.test_vault_status_unlocked3sE%L!
  60  
  61  1
!#K#KKKKvKKKKKKvKKKKvKKKKKKK'A&%KKKKKKKKKrcbVPVR,4\P!^4VPR4VP	4pRqeV8Hqw'g\
  62  P!RV3R
WV34RR\P!49g\
  63  P!V4'd\
  64  P!V4MRR\
  65  P!V4/,p\
  66  P!RVR24R	,R
  67  V/,p	\\
  68  P!V	44hR;rvR#)zLock the vault.rz
  69              var cb = arguments[arguments.length - 1];
  70              window.nostr.smesh.lockVault()
  71                  .then(function() { cb(true); })
  72                  .catch(function() { cb(false); });
  73          lockedrr;r<zexpected 'locked', got 'r=r>r?Nr@rB)rr r!rTrDr
rErrrrr#rrrFs
  74  &&&&&     rtest_lock_vault"TestVaultLifecycle.test_lock_vault:sE%L!
  75  
  76  1
	
  77  
  78  	
!!G!GGGGvGGGGGGvGGGGvGGGGGGG%=fXQ#GGGGGGGGGrcVPVR,4\P!^4VPR4pRqeVJqw'g\P
  79  !RV3R
WV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,pRRV/,p	\\P!V	44hR	;rvVP4p
  80  R
  81  qjV8Hqw'g\P
  82  !RV3RW34RR\P!49g\P!V
  83  4'd\P!V
  84  4MRR\P!V4/,pRRV/,p	\\P!V	44hR	;rvR	#)zUnlock with correct password.rz
  85              var cb = arguments[arguments.length - 1];
  86              window.nostr.smesh.unlockVault('testpass123')
  87                  .then(function(ok) { cb(ok); })
  88                  .catch(function(e) { cb(false); });
  89          TrrOr<assert %(py5)sr?NrYr;rPrRr@rB)
rr r!rTr
rErrrrrrrD)rrr%rrrOrGrrHrIr;s&&&&&      rtest_unlock_vault$TestVaultLifecycle.test_unlock_vaultGsE%L!
  90  
  91  1

~vvv!#######v######v####v###########rc@VPVR,4\P!^4VPR4VPR4p.pRquVJqq'gRqV
  92  Jqp	V	'Eg\P
  93  !RV3RWW34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,pR	R
  94  V/,qPV
4V'g\P
  95  !RX3RVX
  96  34RR\P!49g\P!V4'd\P!V4MRR\P!V
  97  4/,pR
RV/,qPV4\P!V^4/,pRRV/,p\\P!V44hR;p	;p;p;p;rVPR4R#)zWrong password fails.rz
  98              var cb = arguments[arguments.length - 1];
  99              window.nostr.smesh.lockVault().then(function() { cb(true); });
 100          z
 101              var cb = arguments[arguments.length - 1];
 102              window.nostr.smesh.unlockVault('wrongpassword')
 103                  .then(function(ok) { cb(ok); })
 104                  .catch(function(e) { cb(false); });
 105          FNrrOr?z%(py7)spy7py9py12z%(py14)spy14zassert %(py17)spy17z
 106              var cb = arguments[arguments.length - 1];
 107              window.nostr.smesh.unlockVault('testpass123')
 108                  .then(function(ok) { cb(ok); });
 109          rP)z%(py2)s is %(py5)s)z%(py9)s is %(py12)s)rr r!rTr
rErrrrappend_format_booloprr)rrr%rrrOr@py_assert4r@py_assert0@py_assert11@py_assert10rI@py_format8@py_format13@py_format15@py_format16@py_format18s&&&&&             rtest_unlock_wrong_password-TestVaultLifecycle.test_unlock_wrong_passwordUs(E%L!
 110  
 111  1
	
 112  
 113  	

	1000D0D.0000v000000v0000v000000000000&D000000&0000&000D0000000000000000	
 114  
 115  	
rr-N)
r.r/r0r1r2rJrVrZr^rbrur3r4r5s@rr8r8s.1D
 116  <LH$

rr8c<a]tRt^mtoRtRtRtRtRtRt	Vt
 117  R#)TestIdentitiesz+Identity management via window.nostr.smesh.c^VPVR,4\P!^4VPR4VPR^
 118  R7pRqeVJqw'g\P
 119  !R
V3RWV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,p\P!R	4R
 120  ,RV/,p	\\P!V	44hR;rvR#)zAdd an nsec identity.rz
 121              var cb = arguments[arguments.length - 1];
 122              window.nostr.smesh.unlockVault('testpass123')
 123                  .then(function() { cb(true); })
 124                  .catch(function() { cb(true); });
 125          a
 126              var cb = arguments[arguments.length - 1];
 127              window.nostr.smesh.addIdentity('nsec1jz5zyz6np29zg9k7wu5zvnpusuha8ca84v8ahdme9pdwjlalcsjsp59265')
 128                  .then(function(ok) { cb(ok); })
 129                  .catch(function(e) { cb(false); });
 130          rMTrrOr<zaddIdentity returned falser>r?NrPrRrSrUs
 131  &&&&&     rtest_add_identity TestIdentities.test_add_identitypsE%L!
 132  
 133  1
	
 134  
 135  	

 136  ;~;;;;v;;;;;;v;;;;v;;;;;;;;;;;;;;;;rc$VPVR,4\P!^4VPR4VPR4pRqeVJqw'g\P
 137  !RV3RWV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,pRR	V/,p	\\P!V	44hR;rv^RIp
 138  \V\4'dV
 139  PV4p\!V4p^qV8q'Eg8\P
 140  !RV3RWk34RR
 141  \P!49g!\P!\ 4'd\P!\ 4MR
 142  RR\P!49g\P!V4'd\P!V4MRR\P!V4R\P!V4/,p
\P"!R
4R,RV
/,p\\P!V44hR;p;rR#)z#List returns at least one identity.rz
 143              var cb = arguments[arguments.length - 1];
 144              window.nostr.smesh.unlockVault('testpass123')
 145                  .then(function() { cb(true); }).catch(function() { cb(true); });
 146          z
 147              var cb = arguments[arguments.length - 1];
 148              window.nostr.smesh.listIdentities()
 149                  .then(function(list) { cb(list); })
 150                  .catch(function(e) { cb('[]'); });
 151          Nridsr<rar?lenpy1r	zno identities returned
 152  >assert %(py8)spy8is notz%(py0)s is not %(py3)s>z/%(py3)s
 153  {%(py3)s = %(py0)s(%(py1)s)
 154  } > %(py6)s)rr r!rTr
rErrrrrrjson
 155  isinstancestrloadsr~r#)rrr%rrr}rGrrHrIrrrlr@py_format9s&&&&&          rtest_list_identities#TestIdentities.test_list_identitiessdE%L!
 156  
 157  1
	
 158  
 159  	
 160  jj
$sss$c3**S/C3x5!5!|5555x555555s5555s5555555355553555x555!5555555555555rcVPVR,4\P!^4VP4pRqeVJqw'g\P
 161  !RV3RWV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,p\P!R4R,RV/,p	\\P!V	44hR;rv\V4p^@qV
 162  8Hq'EgD\P
 163  !RV3RWj34RR	\P!49g!\P!\4'd\P!\4MR	R
 164  R\P!49g\P!V4'd\P!V4MRR\P!V4R\P!V
 165  4/,p\P!R\V424R
,RV/,p
\\P!V
44hR;p;rR#)z9NIP-07 getPublicKey returns the active identity's pubkey.rNrpkr<zgetPublicKey returned nullr>r?r~rr	zpubkey wrong length: rrrrr@z0%(py3)s
 166  {%(py3)s = %(py0)s(%(py1)s)
 167  } == %(py6)s)rr r!get_public_keyr
rErrrrr#rrr~)rrr%rrrrGrrHrIrrlrrs&&&&&         rtest_get_public_key"TestIdentities.test_get_public_keysDE%L!
 168  
 169  1




;~;;;;r;;;;;;r;;;;r;;;;;;;;;;;;;;;2w?"?"}????w??????s????s???????2????2???w???"???? 5c"gY?????????rc*VPVR,4\P!^4VP4pVP	RVR24pRqvVJq'g\
 170  P!RV3RWg34RR\P!49g\
 171  P!V4'd\
 172  P!V4MRR\
 173  P!V4/,p	RR	V	/,p
 174  \\
 175  P!V
 176  44hR
 177  ;rR
 178  #)
z Switch to an identity by pubkey.rzf
 179              var cb = arguments[arguments.length - 1];
 180              window.nostr.smesh.switchIdentity('zo')
 181                  .then(function(ok) { cb(ok); })
 182                  .catch(function(e) { cb(false); });
 183          TrrOr<rar?NrPrR)
rr r!rrTr
rErrrrrr)rrr%rrrrOrGrrHrIs&&&&&      rtest_switch_identity#TestIdentities.test_switch_identitysE%L!
 184  
 185  1




!002t4	
~vvvrr-N)r.r/r0r1r2rzrrrr3r4r5s@rrxrxms"5<(6,@rrxc6a]tRt^toRtRtRtRtRtVt	R#)TestSignerModalz*The signer modal overlay in the sm3sh app.c6VPVR,4\P!^4RpVPRVR24VP	4\P!^4VPR4pRqvP
 186  q!4qV	9q'g\P!RV
 187  3RWy34R\P!V4RR\P!49g\P!V4'd\P!V4MRR	\P!V4R
 188  \P!V	4/,p\P!R4R,R
V/,p\\P!V44hR;p;p
 189  ;rR#)z;The top bar has a signer button (requires being logged in).rz&localStorage.setItem('smesh-pubkey', 'z')zreturn document.body.innerTextsignerrr<	page_textr?rezsigner button text not found
 190  >assert %(py9)srfN@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaain)zD%(py1)s in %(py7)s
 191  {%(py7)s = %(py5)s
 192  {%(py5)s = %(py3)s.lower
 193  }()
 194  })rr r!jsrefreshlowerr
rErrrrr#rr)
rrr%rrdummy_pkrrmrl@py_assert6rGrp@py_format10s
&&&&&        rtest_signer_button_exists)TestSignerModal.test_signer_button_existssE%L!
 195  
 196  1
	5hZr
BC
 197  
 198  1
DD9:	L??L?,L,,LLLLxLLLxLLLLLL9LLLL9LLL?LLL,LLLL.LLLLLLLLLrcVPVR,4\P!^4VPR4VP	4\P!^4VP\PR4pVP4\P!^4VP\PR4p\V4p^qV8q'Eg8\P !RV	3RWx34RR\"P$!49g!\P&!\4'd\P(!\4MRRR\"P$!49g\P&!V4'd\P(!V4MRR	\P(!V4R
 199  \P(!V4/,p
 200  \P*!R4R,R
V
 201  /,p\-\P.!V44hR;p;rR# \d\P!R4ELi;i)z+Clicking the signer button opens the modal.rz#//button[contains(text(),'signer')]z'signer button not found in current view.signer-backdroprr~rbackdropr<r	zsigner modal backdrop not foundrrNzhlocalStorage.setItem('smesh-pubkey', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')rr)rr r!rrfind_elementrXPATHclick	Exceptionpytestskip
find_elementsCSS_SELECTORr~r
rErrrrr#rr)rrr%rrbtnrrGrrlrrs&&&&&       rtest_modal_opens TestSignerModal.test_modal_openssOE%L!
 202  
 203  1
	
GH
 204  
 205  1
	C&&rxx1VWCIIKJJqM((:LM8}CqCq CCCC}CCCCCCsCCCCsCCCCCCC8CCCC8CCC}CCCqCCCC"CCCCCCCCC		CKKAB	Cs'AH$$!I	I	cVP\PR4pV'd.V^,P4\P
 206  !R4VP\PR4p\
V4p^qV8Hq'Eg8\P!RV	3RWx34RR\P!49g!\P!\4'd\P!\4MRRR\P!49g\P!V4'd\P!V4MRR\P!V4R	\P!V4/,p
 207  \P!R
 208  4R,RV
 209  /,p\\P!V44hR
;p;rR
#)z.Clicking the close button dismisses the modal.z
.signer-closeg?rrr~rrr<r	zmodal still visible after closerrNr@r)rrrrr r!r~r
rErrrrr#rr)rrr%rrcloserrGrrlrrs&&&&&       rtest_modal_closes!TestSignerModal.test_modal_closess%%booG!HNNJJsO((:LM8}DD!DDDD}DDDDDDsDDDDsDDDDDDD8DDDD8DDD}DDDDDDD#DDDDDDDDDrr-N)
 210  r.r/r0r1r2rrrr3r4r5s@rrrs 4MD$EErrc*a]tRt^toRtRtRtVtR#)TestNIP07SigningzNIP-07 event signing flow.cVPVR,4\P!^4VPR^<R7pRqeVJqw'g\P
 211  !RV3RWV34RR\P!49g\P!V4'd\P!V4MRR\P!V4/,p\P!R4R	,R
 212  V/,p	\\P!V	44hR;rv^RI
p
 213  \V\4'd1VP!R4'd\"P$!RV24\V\4'dV
 214  P'V4MTpR
qV9qf'g\P
 215  !RV3RW34R\P!V4RR\P!49g\P!V4'd\P!V4MR/,p\P!R4R	,R
 216  V/,p	\\P!V	44hR;rRqV9qf'g\P
 217  !RV3RW34R\P!V4RR\P!49g\P!V4'd\P!V4MR/,p\P!R4R	,R
 218  V/,p	\\P!V	44hR;rRqV9qf'g\P
 219  !RV3RW34R\P!V4RR\P!49g\P!V4'd\P!V4MR/,p\P!R4R	,R
 220  V/,p	\\P!V	44hR;rVR
,p\)V4p
^qV8Hq'Eg\P
 221  !R V3R!W34RR\P!49g!\P!\(4'd\P!\(4MRR\P!V4R\P!V
4R\P!V4/,p\P!R\)VR
,424R,RV/,p\\P!V44hR;p;p
;rRqV9qf'g\P
 222  !RV3RW34R\P!V4RR\P!49g\P!V4'd\P!V4MR/,p\P!R4R	,R
 223  V/,p	\\P!V	44hR;rRqV9qf'g\P
 224  !RV3RW34R\P!V4RR\P!49g\P!V4'd\P!V4MR/,p\P!R4R	,R
 225  V/,p	\\P!V	44hR;rVR
,p\)V4p
^qV8Hq'Eg\P
 226  !R V3R!W34RR\P!49g!\P!\(4'd\P!\(4MRR\P!V4R\P!V
4R\P!V4/,p\P!R\)VR
,424R,RV/,p\\P!V44hR;p;p
;rR#)"z/Sign a kind-1 event via window.nostr.signEvent.ra
 227              var cb = arguments[arguments.length - 1];
 228              var ev = {
 229                  kind: 1,
 230                  created_at: Math.floor(Date.now() / 1000),
 231                  tags: [],
 232                  content: "test note from selenium"
 233              };
 234              window.nostr.signEvent(ev)
 235                  .then(function(signed) { cb(JSON.stringify(signed)); })
 236                  .catch(function(e) { cb('error:' + e.message); });
 237          rMNrrOr<zsignEvent returned nullr>r?zerror:zsignEvent error: sigrsignedzsigned event missing sig fieldidzsigned event missing id fieldpubkeyz!signed event missing pubkey fieldr~rrrezsig wrong length: rrfrrr)z%(py1)s in %(py3)sr@)z0%(py4)s
 238  {%(py4)s = %(py0)s(%(py2)s)
 239  } == %(py7)s)rr r!rTr
rErrrrr#rrrrrr
 240  rfailrr~)rrr%rrrOrGrrHrIrrrmrrrrprs&&&&&             rtest_sign_event TestNIP07Signing.test_sign_eventsWE%L!
 241  
 242  1
"<T!<<<<v<<<<<<v<<<<v<<<T<<<<#<<<<<<<<fc""v'8'8'B'BKK+F845'1&#'>'>F#F@@@@@u@@@u@@@@@@@@@@@@@@ @@@@@@@@>v~>>>>t>>>t>>>>>>v>>>>v>>>>>>>>>>>>F6!FFFFxFFFxFFFFFF6FFFF6FFFF#FFFFFFFF%=Ss=!SSSS(SSSS!SSSSSSsSSSSsSSS=SSS!SSSSSSSS,>s6%=?Q>R*SSSSSSSSS>v~>>>>t>>>t>>>>>>v>>>>v>>>>>>>>>>>>F6!FFFFxFFFxFFFFFF6FFFF6FFFF#FFFFFFFF%=Ss=!SSSS(SSSS!SSSSSSsSSSSsSSS=SSS!SSSSSSSS,>s6%=?Q>R*SSSSSSSSSrr-N)r.r/r0r1r2rr3r4r5s@rrrs$TTrr)r2builtinsr_pytest.assertion.rewrite	assertionrewriter
r rselenium.webdriver.common.byrrr8rxrrr-rr<module>rsRJ
+==(M
M
`@@F)E)EXTTr