;ò ÔG¢Cc@sidZdkZdkZdkZdkZdkZdkZedjo$eei i ei ddƒƒndk l Z dk lZlZlZe idƒdklZlZd klZd klZd klZd klZlZd klZlZl Z dk!l"Z"e i i#ƒe i i$ddƒ\Z%Z&dde'd„Z(dfd„ƒYZ)dfd„ƒYZ*dfd„ƒYZ+de+e i fd„ƒYZ,de i fd„ƒYZ-dfd„ƒYZ.de.e+e i/e i fd „ƒYZ0d!eifd"„ƒYZ1d#e i fd$„ƒYZ2d%e.e+e i3fd&„ƒYZ4d'„Z5edjo e6ƒndS((s# Unit and integration tests for ZSyncer. We currently test a lot of non-API methods because there are so many of them, and we really want to be sure the implementation works! This is largely to get a good sense of the current behavior of the code to enable future cleanup and refactorings. Ns__main__is framework.py(s ZopeTestCase(s transactions user_names user_passwordsZSyncer(s UnauthorizedsgetSecurityManager(sDateTime(sNotFound(smanage_addZSyncer(sZSyncerObjNotFoundsZSyncerConfigError(sConfigsZSyncersutils(s BadRequestsnumber_of_threadsisc CsT|tjo td‚n|idid|d|d|ddƒt||ƒSdS(NsNo container specifiedsOFSPsidstitlesfiles content_types text/plain( s containersNones ValueErrorsmanage_addProductsmanage_addFilesidstitlestextsgetattr(sidstitlestexts container((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys _makeFile.s  )s FakeResponsecBs#tZd„Zd„Zd„ZRS(NcCs g|_dS(N(sselfsoutput(sself((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys__init__9scCs|ii|ƒdS(N(sselfsoutputsappendsdata(sselfsdata((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pyswrite;scCsdi|iƒSdS(Ns(sjoinsselfsoutput(sself((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pysread=s(s__name__s __module__s__init__swritesread(((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys FakeResponse8s  s DummyMessagecBstZd„Zd„ZRS(NcCs ||_dS(N(stextsselfsmsg(sselfstext((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys__init__AscCs |iSdS(N(sselfsmsg(sself((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pyshtmlCs(s__name__s __module__s__init__shtml(((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys DummyMessage@s s ZSyncerSetUpcBstZd„Zd„ZRS(Nc Cs²|iddgƒt|idƒ|ii|_d}d}d}td|d|d |d |iƒ}|i||_ ||_ ||_ ||_ d i|i iƒƒ|_dS( NsManagersMemberszs1s some_files,This is a test file. It has some text in it.sA file for testingsidstextstitles containers/(sselfssetRolessmanage_addZSyncersfolderszs1sidstextstitles _makeFilesafilesfile1sfile1_ids file1_texts file1_titlesjoinsgetPhysicalPaths file1_path(sselfstitlestextsafilesid((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys afterSetUpHs   cCsdS(N((sself((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys test_setUpZs(s__name__s __module__s afterSetUps test_setUp(((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys ZSyncerSetUpFs sTestZSyncerBasicscBs tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZRS(s?Test everything that does NOT require a remote connection. cCsX|i|ii|iƒ|iƒ|ii|iƒ|i|ii|iƒdƒdS(Ni”(sselfs assertEqualszs1smanage_getSourcesfile1_ids file1_textsfoldersmanage_delObjects(sself((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_manage_getSourcees  cCsµ|ii}ti}|i|ti ƒ|ti ƒ|i|ti ƒ|ti ƒ|i|ti ƒ|ti ƒ|i|ti ƒ|ti ƒ|i|dddƒdƒdS(Ns asdfafuasfsdefaults a can of spam( sselfszs1s status_coloursscsConfigscolourssexpecteds assertEqualsZSyncersOKsMISSINGsOODsEXTRA(sselfsscsexpected((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_status_colourms      cCsRxKtitidfD]4}|ii|ƒ}|it |ƒt dƒƒqWdS(Nsan imaginary statuss( sZSyncersOKsMISSINGsstatussselfszs1s status_descrsdescrs assertEqualstype(sselfsstatussdescr((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_status_descrxscCs€|ii}htid<tid<tid<tid<dd<}x.|i ƒD] }|i ||||ƒƒqXWdS(Ns/misc_/ZSyncer/zsyncer_ok.gifs"/misc_/ZSyncer/zsyncer_missing.gifs#/misc_/ZSyncer/zsyncer_outdated.gifs /misc_/ZSyncer/zsyncer_extra.gifsan imaginary statuss( sselfszs1s status_iconsZSyncersOKsMISSINGsOODsEXTRAsexpectedskeyssstatuss assertEqual(sselfsexpecteds status_iconsstatus((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_status_icon~s  ?  cCsí|i}|i}|i|i|ƒƒd|_g|_|i|i|ƒƒ|ii|i ƒ|i|i|ƒƒd|_ |i i|i ƒ|i|i|ƒƒd|_ |i|i|ƒƒd|_ |i|i|ƒƒdS(Niis+Broken Because something horrible happened.( sselfszs1sfile1s failUnlesss_isComparisonAlloweds filterObjectsssyncablesfailIfsappends meta_typesfilterOutObjectss non_syncable(sselfsfile1szs1((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_isComparisonAllowed‹s       cCsÑ|i}|ii|ƒ}|i|d|iƒ|i|diƒ|i ƒiƒƒ|i|ddƒ|i|dd|i ƒ|i|d|i ƒdƒ|i|d d ƒ|i|d d ƒdS( Nsidslast_modified_times dc_modtimessicons/spathiÿÿÿÿs meta_typesFiles is_folderi( sselfsfile1sobjszs1s_getInfoForObjectsds assertEqualsfile1_idsISOsbobobase_modification_timesiconsgetPhysicalPath(sselfsobjsd((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_getInfoForObject¡s cCsï|iiƒ}|ii|ƒ}|i|d|iiƒƒ|i|d|iƒ|i|d|iƒ|ii|ii ƒƒ}|i||ƒd}|ii|ƒ}|i|d|ƒ|i|d|ƒ|i|ddƒdS(Nsabsolute_url_paths relative_paths id_or_paths/I/do/not/existsexist( sselfsfile1sabsolute_url_pathspathszs1s getPathInfos path_infos assertEqualsfile1_idsgetPhysicalPaths path_info_2sbad_pathsbad_info(sselfsbad_pathsbad_infos path_infos path_info_2spath((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_getPathInfo¯s     cCs‘|i}|iiƒ}d|_||_|iƒ}|i ||iƒd|_|i ||iƒd|_|iƒ}|i ||i ƒdS(Nisi( sselfszs1sfoldersabsolute_url_pathspathsuse_relative_pathssrelative_path_bases_getSyncerRootsobjs assertEqualsapp(sselfspathsobjszs1((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_getSyncerRootÂs       cCs†|i}|i}d|_|i|ƒdƒd|_|i|ƒdƒd|_|i|ƒdƒd|_|i|ƒdƒdS(Nis/iss foo/bar/bazs foo/bar/baz (sselfszs1sgetSyncerRootPathsgsrpsuse_relative_pathss assertEqualsrelative_path_base(sselfsgsrpszs1((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_getSyncerRootPathÒs      cCsW|iiƒ}|ii|ƒ}|i|i|ƒd}|i t |ii|ƒdS(Ns"/I/do/not/think/therefore/I/am/not( sselfsfile1sgetIdspathszs1straverseFromRootsobjs assertEqualsbad_paths assertRaisessZSyncerObjNotFound(sselfspathsobjsbad_path((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_traverseFromRootßs cCsV|i}|i}|it|dƒt|_di|i i ƒƒ|_ t ddddd|i ƒ}|it||dtƒ|it||ƒ||dtƒt|_|id df||ƒƒt|_d|_ |id df||ƒƒd |_ t|_|i||iƒ|iiƒfƒ|i||iƒ|iiƒfƒdS( Ns no/such/things/sidsfoofilestexts who cares?s containersstricts(sselfszs1s_getRelativePhysicalPathsgrpps assertRaisessZSyncerObjNotFoundsTruesuse_relative_pathssjoinsfoldersgetPhysicalPathsrelative_path_bases _makeFilesappsfile_outside_fols ValueErrorsFalses assertEqualsfile1sgetIds file1_path(sselfszs1sfile_outside_folsgrpp((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_getRelativePhysicalPathçs.          cCsã|ii}d}|i||dddƒ|igƒ|i||dƒ|iiƒƒ|ii dƒ|ii i ddgƒ|i t |iidƒ|i t ||ii iƒdƒ|i|tdƒ|iiƒƒdS( Nss objectIdssspecsFilesgetIdsfolder2sAccess contents informationsroles(sselfszs1s callMethod_scallerspaths assertEqualsfile1_idsfoldersgetIdsmanage_addFoldersfolder2smanage_permissions assertRaisess UnauthorizedsrestrictedTraversesNone(sselfspathscaller((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_callMethod_s     cCs^|ii}d}hd|<dd<dhdd<tZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCsq|itidƒdƒ|itiddƒdƒ|itiddƒdƒ|itiddƒdƒdS(Ns blahsblahsabcdesasbcdesaaaabcdes(sselfs assertEqualsutilsslstrip(sself((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys test_lstripmscCsQ|iti|iƒƒtddd|iƒ}|iti|iiƒƒdS(Nsidsafiles container(sselfsfailIfsutilssisZClassFoldersfolders _makeFilesafile(sselfsafile((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_isZClassFoldertscCsÐti}|it|tƒ|i|dƒdƒ|i|dƒdƒ|i|dƒdƒ|i|dƒdƒ|i|dƒdƒ|i|dƒd ƒ|i|d ƒdƒ|i|d ƒdƒdS( Ns/sa/b/csa//b/csa/../b/csb/csa/..ssa/../bsbs a/b/../..sa/b/c/../../../../..(sutilssnormalizeRelativeURLsnormsselfs assertRaisess TypeErrorsNones assertEqual(sselfsnorm((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_normalizeRelativeURLzs cCsDtƒ}|iƒ}|itti|ƒt i ƒƒ|i ti|ƒi t |ƒƒƒ|d}d|}t|ƒ}ti|ƒ|iti|ƒit |ƒƒƒ|iti|ƒidƒƒ|i ti|ƒi dƒƒ|iti|ƒti|ƒƒ|idtidƒƒ|idtidƒƒdS(Nis01/01/%d 12:30 pmsJan 01s12:30ssabcd 99(sDateTimesnowsyears current_yearsselfs failUnlesss isinstancesutilssnormalize_timestypess StringTypesfailIfscountsstrs last_yearsdate_strsold_datesendswiths startswiths assertEqual(sselfsnowsold_datesdate_strs current_years last_year((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_normalize_time†s    %    %cCs¢|igti|iƒƒt|idƒ|ii}ti|iƒ}|it|ƒdƒ|d}|i|d|ƒ|i |di |i ƒƒƒdS(Nszs1iissyncersurl( sselfs assertEqualsutilss listSyncerssappsmanage_addZSyncerszs1sresultsslensresults failUnlesss startswiths absolute_url(sselfszs1sresultssresult((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_listSyncersžs  cCs×t|idƒ|ii}|iddd|iiƒƒti|iƒ}|i t |ƒdƒ|d}|i |d|ƒ|i |di dd i|i|iƒƒƒƒti|iƒ}|i|ƒdS( Nszs2suse_relative_pathsisrelative_path_baseissyncersurls ?folder=%ss/(smanage_addZSyncersselfsfolderszs2smanage_changePropertiessabsolute_url_pathsutilss listSyncerssresultss assertEqualslensresults failUnlesssendswithsjoins_getRelativePhysicalPathsappsfailIf(sselfszs2sresultssresult((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_listSyncers_bug_1325930­s   3(s__name__s __module__s test_lstripstest_isZClassFolderstest_normalizeRelativeURLstest_normalize_timestest_listSyncersstest_listSyncers_bug_1325930(((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys TestUtilshs     s RemoteSetUpcBstZd„ZRS(NcCs!ti|ƒ|iidƒ|ii|_t|idƒ|ii|_|iiƒ|_ |i i d|i ƒt |i d|id|iƒ|i|iiƒ|_d|_t dd|id|iƒ|ii|_d|_t d d|id|iƒ|ii|_tiƒdS( Nsfolder2szs2s dest_serversstexts containersextra extra read all about it.s file_extras#missing persons destination unknowns file_missing(s ZSyncerSetUps afterSetUpsselfsfoldersmanage_addFoldersfolder2smanage_addZSyncerszs2s absolute_urls destinationszs1smanage_changePropertiess _makeFilesfile1_ids file1_textsfile1sgetIds file1_copysfile_extra_texts file_extrasfile_missing_texts file_missings transactionscommit(sself((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys afterSetUpÅs&      (s__name__s __module__s afterSetUp(((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys RemoteSetUpÄssTestRemoteMethodscBsŒtZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„ZRS(s>Test everything that actually talks to the remote server. cCs\|i}|ii|iƒ}|i|ƒ}|it|dƒdjƒ|i t|dƒdƒ|i |ddƒ|i |d|i ƒ|i|i ƒ}|i|ƒ}|i |ddƒ|it|dƒdjƒ|i |d|i ƒ|i |d|i ƒ|i i|iƒ}|i|ƒ}|i |ddƒ|i|dƒdS( Nserrorisdiffsdesti”ssourcesi(sselfszs1s_getRelativePhysicalPaths file_missingspathsmanage_diffObjectsdiffdicts failUnlessslens assertEqualsfile_missing_textsfile1s file1_textszs2s file_extra(sselfspathszs1sdiffdict((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_manage_diffObjectìs" cCs\|ii}|it|dƒ|dƒ}h}x |dD]}|||d|ii|iƒ}|iƒ}|i||iiƒƒdS(N( sselfszs1s_getServerConns destinationsconnsgetIdsids assertEqualszs2(sselfsidsconn((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_getServerConn|s c sƈiiƒ}ˆii|dƒ}|\}}ˆi|dˆi i ƒƒ‡d†}||ƒ|i ƒ}|iƒˆi idƒ}|iƒˆi||ƒ|ˆii ƒ}||ƒdS(Nssidcsqhdtitf<dtif<dtif<dtitif<dtf<dtif<dtif<dtif<d tif<d tif<d tititif<}x*|iƒD]}ˆi |i |ƒƒqÊWx€|iƒD]r}ˆi |i |ƒƒxS||D]}t|||ƒoPqqWˆid |||t||ƒfƒq÷WdS( Ns dc_modtimesiconsids is_folderslast_modified_times meta_typespathsabsolute_url_paths relative_paths id_or_pathssizes+%s value %s is not an instance of any of %s(stypess StringTypesDateTimesIntTypes BooleanTypes TupleTypes FloatTypestypemapskeysskeysselfs failUnlesssadictshas_keysatypes isinstancesfailsstr(sadictsatypeskeystypemap(sself(sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys verify_dict‰s½    sFile(sselfszs1s_getFirstDestinationsservers_getRemoteListsresults folder2_infossub_infos assertEqualsfolder2sgetIds verify_dictskeysssub_keysssorts objectIdss expected_keyss file_extrasfile_extra_info( sselfsfile_extra_infos verify_dictsservers expected_keyssresultssub_infos folder2_infossub_keys((sselfsF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_getRemoteListƒs      cCsˆ|iiƒ}|ii|i|ƒ}|i||i ƒ|ii|idƒ}|i|dƒ|i t |ii|i|i ƒdS(Ns no such thingi”(sselfs file_extrasgetIdspathszs1s _srcRemotes destinationsdatas assertEqualsfile_extra_texts notfound_datas assertRaisess ValueErrors file1_path(sselfspathsdatas notfound_data((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_srcRemote­scCsè|ii|idƒ}|i|dƒ|ii|i|iiƒƒ}|i|dƒzzti dƒ|ii|i|i iƒƒ}|i i ƒ}|i|dƒ|iiiƒ|it|ii|ƒWdtidƒXdS(Ns no such thingi”iiÈ(sselfszs1s _deleteRemotes destinationsnotfound_responses assertEquals file_missingsgetIds transactionscommits file_extrasresponsesgetPhysicalPaths extra_pathsapps_p_jarssyncs assertRaisessKeyErrorsunrestrictedTraversesabort(sselfsnotfound_responses extra_pathsresponse((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_deleteRemote¸s"   cCs|ii|iƒ}|ii|ƒ}|ii|i||ƒ}|i |dƒ|ii ƒ}|i ||iiƒjƒdS(NiÈ(sselfszs1s_getRelativePhysicalPaths file_missingspathsmanage_getExportDatasdatas_exportToRemotes destinationsresponses assertEqualsgetIdsids failUnlesssfolder2s objectIds(sselfspathsdatasresponsesid((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_exportToRemoteÒs cCs|iiƒ}|ii||iiƒdƒ}|i||iiƒƒ|ii||iiƒdƒ}|i||ii ƒƒ|i|ii||iiƒdƒdddgƒ|ii||iiƒddd d ƒ|ii||iiƒd dƒ}|i |ƒd }|ii||iiƒd d|ddƒ|ii||iiƒd dƒ}|i||ƒ|ii||iiƒd dƒ}|i|ƒ|it|ii||iiƒdddgƒ|i|ii|tdƒ|iiƒƒdS(NsgetIdsgetPhysicalPaths propertyIdsstitlesalts content_typesmanage_addPropertys sillyFlagisbooleans getPropertys-This is my new shiny title. It cost 50 cents.smanage_changePropertiesismanage_delPropertiessidssbogosity(sselfszs1s_getFirstDestinations server_urls callRemotes file_extrasgetIdsids assertEqualspathsgetPhysicalPathsflags failUnlesss new_titlestitlesfailIfs assertRaisess BadRequestsNoneszs2(sselfstitles new_titles server_urlsflagspathsid((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pystest_callRemoteÞsD            cCs‹|ii}hdd<ddtZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCs|||fSdS(N(snamesargsskw(sselfsnamesargsskw((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys _showArgs—scOs|id||ƒSdS(Nsmanage_pushToRemote(sselfs _showArgssargsskw(sselfsargsskw((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pysmanage_pushToRemotešscOs|id||ƒSdS(Nsmanage_syncDelete(sselfs _showArgssargsskw(sselfsargsskw((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pysmanage_syncDeletescOs|id||ƒSdS(Nsmanage_pullFromRemote(sselfs _showArgssargsskw(sselfsargsskw((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pysmanage_pullFromRemote scOs|id||ƒSdS(Ns manage_touch(sselfs _showArgssargsskw(sselfsargsskw((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys manage_touch£scOsdSdS(Nserror!((sselfsargsskw((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys_error¦s(s__name__s __module__s _showArgssmanage_pushToRemotesmanage_syncDeletesmanage_pullFromRemotes manage_touchs_error(((sF/mnt/gmirror/ports/www/zope-zsyncer/work/ZSyncer/tests/test_ZSyncer.pys MockZSyncers      sTestManageApprovedActioncBstZd„ZRS(NcCstdƒi}|i|ddƒdƒdddgfhdh<d d d g