€cdocutils.nodes document q)q}q(U nametypesq}q(XwikiqˆX web testingqNXogc citeqNX travis ciq ˆXtesterq NXpaverq ˆXtestingq ˆXtestsq ˆXadding new testsqNXrunning locallyqNX failed testsqNXogc-citeqˆX test suitesqNX=compliance & interoperability testing & evaluation initiativeqˆuUsubstitution_defsq}qUparse_messagesq]qcdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedq KhhUsourceq!X!/tmp/pycsw-2.0.2/docs/testing.rstq"Uexpect_referenced_by_nameq#}q$h cdocutils.nodes target q%)q&}q'(hX .. _testing:hhh!h"Utagnameq(Utargetq)U attributesq*}q+(Uidsq,]Ubackrefsq-]Udupnamesq.]Uclassesq/]Unamesq0]Urefidq1Utestingq2uUlineq3KUdocumentq4hUchildrenq5]ubsh(Usectionq6h*}q7(h.]q8Xtestingq9ah/]h-]h,]q:(h2Uid1q;eh0]qh2h&sh5]q?(cdocutils.nodes title q@)qA}qB(hXTestingqChhh!h"h(UtitleqDh*}qE(h.]h/]h-]h,]h0]uh3Kh4hh5]qFcdocutils.nodes Text qGXTestingqH…qI}qJ(hhChhAubaubh%)qK}qL(hX .. _ogc-cite:hhh!h"h(h)h*}qM(h,]h-]h.]h/]h0]h1Uogc-citeqNuh3Kh4hh5]ubh)qO}qP(hUhhh!h"h#}qQhhKsh(h6h*}qR(h.]h/]h-]h,]qS(hNUid2qTeh0]qU(hheuh3K h4hh=}qVhNhKsh5]qW(h@)qX}qY(hXOGC CITEqZhhOh!h"h(hDh*}q[(h.]h/]h-]h,]h0]uh3K h4hh5]q\hGXOGC CITEq]…q^}q_(hhZhhXubaubcdocutils.nodes paragraph q`)qa}qb(hXçCompliance benchmarking is done via the OGC `Compliance & Interoperability Testing & Evaluation Initiative`_. The pycsw `wiki `_ documents testing procedures and status.qchhOh!h"h(U paragraphqdh*}qe(h.]h/]h-]h,]h0]uh3K h4hh5]qf(hGX,Compliance benchmarking is done via the OGC qg…qh}qi(hX,Compliance benchmarking is done via the OGC hhaubcdocutils.nodes reference qj)qk}ql(hX@`Compliance & Interoperability Testing & Evaluation Initiative`_UresolvedqmKhhah(U referenceqnh*}qo(UnameX=Compliance & Interoperability Testing & Evaluation InitiativeUrefuriqpXhttp://cite.opengeospatial.org/qqh,]h-]h.]h/]h0]uh5]qrhGX=Compliance & Interoperability Testing & Evaluation Initiativeqs…qt}qu(hUhhkubaubhGX . The pycsw qv…qw}qx(hX . The pycsw hhaubhj)qy}qz(hXE`wiki `_h*}q{(UnamehhpX;https://github.com/geopython/pycsw/wiki/OGC-CITE-Complianceq|h,]h-]h.]h/]h0]uhhah5]q}hGXwikiq~…q}q€(hUhhyubah(hnubh%)q}q‚(hX> h Khhah(h)h*}qƒ(Urefurih|h,]q„Uwikiq…ah-]h.]h/]h0]q†hauh5]ubhGX) documents testing procedures and status.q‡…qˆ}q‰(hX) documents testing procedures and status.hhaubeubh%)qŠ}q‹(hX .. _tests:hhOh!h"h(h)h*}qŒ(h,]h-]h.]h/]h0]h1Utestsquh3K h4hh5]ubeubh)qŽ}q(hUhhh!h"h#}qh hŠsh(h6h*}q‘(h.]h/]h-]h,]q’(Utesterq“heh0]q”(h h euh3Kh4hh=}q•hhŠsh5]q–(h@)q—}q˜(hXTesterq™hhŽh!h"h(hDh*}qš(h.]h/]h-]h,]h0]uh3Kh4hh5]q›hGXTesterqœ…q}qž(hh™hh—ubaubh`)qŸ}q (hXÊThe pycsw tests framework (in ``tests``) is a collection of testsuites to perform automated regession testing of the codebase. Test are run against all pushes to the GitHub repository via `Travis CI`_.q¡hhŽh!h"h(hdh*}q¢(h.]h/]h-]h,]h0]uh3Kh4hh5]q£(hGXThe pycsw tests framework (in q¤…q¥}q¦(hXThe pycsw tests framework (in hhŸubcdocutils.nodes literal q§)q¨}q©(hX ``tests``h*}qª(h.]h/]h-]h,]h0]uhhŸh5]q«hGXtestsq¬…q­}q®(hUhh¨ubah(Uliteralq¯ubhGX–) is a collection of testsuites to perform automated regession testing of the codebase. Test are run against all pushes to the GitHub repository via q°…q±}q²(hX–) is a collection of testsuites to perform automated regession testing of the codebase. Test are run against all pushes to the GitHub repository via hhŸubhj)q³}q´(hX `Travis CI`_hmKhhŸh(hnh*}qµ(UnameX Travis CIhpX$http://travis-ci.org/geopython/pycswq¶h,]h-]h.]h/]h0]uh5]q·hGX Travis CIq¸…q¹}qº(hUhh³ubaubhGX.…q»}q¼(hX.hhŸubeubh)q½}q¾(hUhhŽh!h"h(h6h*}q¿(h.]h/]h-]h,]qÀUrunning-locallyqÁah0]qÂhauh3Kh4hh5]qÃ(h@)qÄ}qÅ(hXRunning LocallyqÆhh½h!h"h(hDh*}qÇ(h.]h/]h-]h,]h0]uh3Kh4hh5]qÈhGXRunning LocallyqÉ…qÊ}qË(hhÆhhÄubaubh`)qÌ}qÍ(hXiThe tests framework can be run from ``tests`` using `Paver`_ (see ``pavement.py``) tasks for convenience:qÎhh½h!h"h(hdh*}qÏ(h.]h/]h-]h,]h0]uh3Kh4hh5]qÐ(hGX$The tests framework can be run from qÑ…qÒ}qÓ(hX$The tests framework can be run from hhÌubh§)qÔ}qÕ(hX ``tests``h*}qÖ(h.]h/]h-]h,]h0]uhhÌh5]q×hGXtestsqØ…qÙ}qÚ(hUhhÔubah(h¯ubhGX using qÛ…qÜ}qÝ(hX using hhÌubhj)qÞ}qß(hX`Paver`_hmKhhÌh(hnh*}qà(UnameXPaverhpXhttp://paver.github.io/paver/qáh,]h-]h.]h/]h0]uh5]qâhGXPaverqã…qä}qå(hUhhÞubaubhGX (see qæ…qç}qè(hX (see hhÌubh§)qé}qê(hX``pavement.py``h*}që(h.]h/]h-]h,]h0]uhhÌh5]qìhGX pavement.pyqí…qî}qï(hUhhéubah(h¯ubhGX) tasks for convenience:qð…qñ}qò(hX) tasks for convenience:hhÌubeubcdocutils.nodes literal_block qó)qô}qõ(hXe$ cd /path/to/pycsw # run all tests (starts up http://localhost:8000) $ paver test # run tests only against specific testsuites $ paver test -s apiso,fgdc # run all tests, including harvesting (this is turned off by default given the volatility of remote services/data testing) $ paver test -r # run all tests with 1000ms time benchmark $ paver test -t 1000hh½h!h"h(U literal_blockqöh*}q÷(Ulinenosqø‰UlanguageqùXbashU xml:spaceqúUpreserveqûh,]h-]h.]Uhighlight_argsqü}h/]h0]uh3Kh4hh5]qýhGXe$ cd /path/to/pycsw # run all tests (starts up http://localhost:8000) $ paver test # run tests only against specific testsuites $ paver test -s apiso,fgdc # run all tests, including harvesting (this is turned off by default given the volatility of remote services/data testing) $ paver test -r # run all tests with 1000ms time benchmark $ paver test -t 1000qþ…qÿ}r(hUhhôubaubh`)r}r(hXThe tests perform HTTP GET and POST requests against ``http://localhost:8000``. The expected output for each test can be found in ``expected``. Results are categorized as ``passed``, ``failed``, or ``initialized``. A summary of results is output at the end of the run.rhh½h!h"h(hdh*}r(h.]h/]h-]h,]h0]uh3K%h4hh5]r(hGX5The tests perform HTTP GET and POST requests against r…r}r(hX5The tests perform HTTP GET and POST requests against hjubh§)r }r (hX``http://localhost:8000``h*}r (h.]h/]h-]h,]h0]uhjh5]r hGXhttp://localhost:8000r …r}r(hUhj ubah(h¯ubhGX5. The expected output for each test can be found in r…r}r(hX5. The expected output for each test can be found in hjubh§)r}r(hX ``expected``h*}r(h.]h/]h-]h,]h0]uhjh5]rhGXexpectedr…r}r(hUhjubah(h¯ubhGX. Results are categorized as r…r}r(hX. Results are categorized as hjubh§)r}r(hX ``passed``h*}r(h.]h/]h-]h,]h0]uhjh5]r hGXpassedr!…r"}r#(hUhjubah(h¯ubhGX, r$…r%}r&(hX, hjubh§)r'}r((hX ``failed``h*}r)(h.]h/]h-]h,]h0]uhjh5]r*hGXfailedr+…r,}r-(hUhj'ubah(h¯ubhGX, or r.…r/}r0(hX, or hjubh§)r1}r2(hX``initialized``h*}r3(h.]h/]h-]h,]h0]uhjh5]r4hGX initializedr5…r6}r7(hUhj1ubah(h¯ubhGX8. A summary of results is output at the end of the run.r8…r9}r:(hX8. A summary of results is output at the end of the run.hjubeubeubh)r;}r<(hUhhŽh!h"h(h6h*}r=(h.]h/]h-]h,]r>U failed-testsr?ah0]r@hauh3K(h4hh5]rA(h@)rB}rC(hX Failed TestsrDhj;h!h"h(hDh*}rE(h.]h/]h-]h,]h0]uh3K(h4hh5]rFhGX Failed TestsrG…rH}rI(hjDhjBubaubh`)rJ}rK(hX<If a given test has failed, the output is saved in ``results``. The resulting failure can be analyzed by running ``diff tests/expected/name_of_test.xml tests/results/name_of_test.xml`` to find variances. The Paver task returns a status code which indicates the number of tests which have failed (i.e. ``echo $?``).rLhj;h!h"h(hdh*}rM(h.]h/]h-]h,]h0]uh3K*h4hh5]rN(hGX3If a given test has failed, the output is saved in rO…rP}rQ(hX3If a given test has failed, the output is saved in hjJubh§)rR}rS(hX ``results``h*}rT(h.]h/]h-]h,]h0]uhjJh5]rUhGXresultsrV…rW}rX(hUhjRubah(h¯ubhGX4. The resulting failure can be analyzed by running rY…rZ}r[(hX4. The resulting failure can be analyzed by running hjJubh§)r\}r](hXG``diff tests/expected/name_of_test.xml tests/results/name_of_test.xml``h*}r^(h.]h/]h-]h,]h0]uhjJh5]r_hGXCdiff tests/expected/name_of_test.xml tests/results/name_of_test.xmlr`…ra}rb(hUhj\ubah(h¯ubhGXv to find variances. The Paver task returns a status code which indicates the number of tests which have failed (i.e. rc…rd}re(hXv to find variances. The Paver task returns a status code which indicates the number of tests which have failed (i.e. hjJubh§)rf}rg(hX ``echo $?``h*}rh(h.]h/]h-]h,]h0]uhjJh5]rihGXecho $?rj…rk}rl(hUhjfubah(h¯ubhGX).rm…rn}ro(hX).hjJubeubeubh)rp}rq(hUhhŽh!h"h(h6h*}rr(h.]h/]h-]h,]rsU test-suitesrtah0]ruhauh3K-h4hh5]rv(h@)rw}rx(hX Test Suitesryhjph!h"h(hDh*}rz(h.]h/]h-]h,]h0]uh3K-h4hh5]r{hGX Test Suitesr|…r}}r~(hjyhjwubaubh`)r}r€(hXÑThe tests framework is run against a series of 'suites' (in ``tests/suites``), each of which specifies a given configuration to test various functionality of the codebase. Each suite is structured as follows:rhjph!h"h(hdh*}r‚(h.]h/]h-]h,]h0]uh3K/h4hh5]rƒ(hGX<The tests framework is run against a series of 'suites' (in r„…r…}r†(hX<The tests framework is run against a series of 'suites' (in hjubh§)r‡}rˆ(hX``tests/suites``h*}r‰(h.]h/]h-]h,]h0]uhjh5]rŠhGX tests/suitesr‹…rŒ}r(hUhj‡ubah(h¯ubhGX…), each of which specifies a given configuration to test various functionality of the codebase. Each suite is structured as follows:rŽ…r}r(hX…), each of which specifies a given configuration to test various functionality of the codebase. Each suite is structured as follows:hjubeubcdocutils.nodes bullet_list r‘)r’}r“(hUhjph!h"h(U bullet_listr”h*}r•(Ubulletr–X*h,]h-]h.]h/]h0]uh3K1h4hh5]r—(cdocutils.nodes list_item r˜)r™}rš(hXC``tests/suites/suite/default.cfg``: the configuration for the suiter›hj’h!h"h(U list_itemrœh*}r(h.]h/]h-]h,]h0]uh3Nh4hh5]ržh`)rŸ}r (hj›hj™h!h"h(hdh*}r¡(h.]h/]h-]h,]h0]uh3K1h5]r¢(h§)r£}r¤(hX"``tests/suites/suite/default.cfg``h*}r¥(h.]h/]h-]h,]h0]uhjŸh5]r¦hGXtests/suites/suite/default.cfgr§…r¨}r©(hUhj£ubah(h¯ubhGX!: the configuration for the suiterª…r«}r¬(hX!: the configuration for the suitehjŸubeubaubj˜)r­}r®(hXN``tests/suites/suite/post``: directory of XML documents for HTTP POST requestsr¯hj’h!h"h(jœh*}r°(h.]h/]h-]h,]h0]uh3Nh4hh5]r±h`)r²}r³(hj¯hj­h!h"h(hdh*}r´(h.]h/]h-]h,]h0]uh3K2h5]rµ(h§)r¶}r·(hX``tests/suites/suite/post``h*}r¸(h.]h/]h-]h,]h0]uhj²h5]r¹hGXtests/suites/suite/postrº…r»}r¼(hUhj¶ubah(h¯ubhGX3: directory of XML documents for HTTP POST requestsr½…r¾}r¿(hX3: directory of XML documents for HTTP POST requestshj²ubeubaubj˜)rÀ}rÁ(hX]``tests/suites/suite/get/requests.txt``: directory and text file of KVP for HTTP GET requestsrÂhj’h!h"h(jœh*}rÃ(h.]h/]h-]h,]h0]uh3Nh4hh5]rÄh`)rÅ}rÆ(hjÂhjÀh!h"h(hdh*}rÇ(h.]h/]h-]h,]h0]uh3K3h5]rÈ(h§)rÉ}rÊ(hX'``tests/suites/suite/get/requests.txt``h*}rË(h.]h/]h-]h,]h0]uhjÅh5]rÌhGX#tests/suites/suite/get/requests.txtrÍ…rÎ}rÏ(hUhjÉubah(h¯ubhGX6: directory and text file of KVP for HTTP GET requestsrÐ…rÑ}rÒ(hX6: directory and text file of KVP for HTTP GET requestshjÅubeubaubj˜)rÓ}rÔ(hX¡``tests/suites/suite/data``: directory of sample XML data required for the test suite. Database and test data are setup/loaded automatically as part of testing hj’h!h"h(jœh*}rÕ(h.]h/]h-]h,]h0]uh3Nh4hh5]rÖh`)r×}rØ(hX ``tests/suites/suite/data``: directory of sample XML data required for the test suite. Database and test data are setup/loaded automatically as part of testinghjÓh!h"h(hdh*}rÙ(h.]h/]h-]h,]h0]uh3K4h5]rÚ(h§)rÛ}rÜ(hX``tests/suites/suite/data``h*}rÝ(h.]h/]h-]h,]h0]uhj×h5]rÞhGXtests/suites/suite/datarß…rà}rá(hUhjÛubah(h¯ubhGX…: directory of sample XML data required for the test suite. Database and test data are setup/loaded automatically as part of testingrâ…rã}rä(hX…: directory of sample XML data required for the test suite. Database and test data are setup/loaded automatically as part of testinghj×ubeubaubeubh`)rå}ræ(hX=When the tests are invoked, the following operations are run:rçhjph!h"h(hdh*}rè(h.]h/]h-]h,]h0]uh3K6h4hh5]réhGX=When the tests are invoked, the following operations are run:rê…rë}rì(hjçhjåubaubj‘)rí}rî(hUhjph!h"h(j”h*}rï(j–X*h,]h-]h.]h/]h0]uh3K8h4hh5]rð(j˜)rñ}rò(hX@pycsw configuration is set to ``tests/suites/suite/default.cfg``róhjíh!h"h(jœh*}rô(h.]h/]h-]h,]h0]uh3Nh4hh5]rõh`)rö}r÷(hjóhjñh!h"h(hdh*}rø(h.]h/]h-]h,]h0]uh3K8h5]rù(hGXpycsw configuration is set to rú…rû}rü(hXpycsw configuration is set to hjöubh§)rý}rþ(hX"``tests/suites/suite/default.cfg``h*}rÿ(h.]h/]h-]h,]h0]uhjöh5]rhGXtests/suites/suite/default.cfgr…r}r(hUhjýubah(h¯ubeubaubj˜)r}r(hXDHTTP POST requests are run against ``tests/suites/suite/post/*.xml``rhjíh!h"h(jœh*}r(h.]h/]h-]h,]h0]uh3Nh4hh5]rh`)r }r (hjhjh!h"h(hdh*}r (h.]h/]h-]h,]h0]uh3K9h5]r (hGX#HTTP POST requests are run against r …r}r(hX#HTTP POST requests are run against hj ubh§)r}r(hX!``tests/suites/suite/post/*.xml``h*}r(h.]h/]h-]h,]h0]uhj h5]rhGXtests/suites/suite/post/*.xmlr…r}r(hUhjubah(h¯ubeubaubj˜)r}r(hXZHTTP GET requests are run against each request in ``tests/suites/suite/get/requests.txt`` hjíh!h"h(jœh*}r(h.]h/]h-]h,]h0]uh3Nh4hh5]rh`)r}r(hXYHTTP GET requests are run against each request in ``tests/suites/suite/get/requests.txt``hjh!h"h(hdh*}r(h.]h/]h-]h,]h0]uh3K:h5]r(hGX2HTTP GET requests are run against each request in r…r }r!(hX2HTTP GET requests are run against each request in hjubh§)r"}r#(hX'``tests/suites/suite/get/requests.txt``h*}r$(h.]h/]h-]h,]h0]uhjh5]r%hGX#tests/suites/suite/get/requests.txtr&…r'}r((hUhj"ubah(h¯ubeubaubeubh`)r)}r*(hXfThe CSV format of ``tests/suites/suite/get/requests.txt`` is ``testname,request``, with one line for each test. The ``testname`` value is a unique test name (this value sets the name of the output file in the test results). The ``request`` value is the HTTP GET request. The ``PYCSW_SERVER`` token is replaced at runtime with the URL to the pycsw install.r+hjph!h"h(hdh*}r,(h.]h/]h-]h,]h0]uh3KhGXtestname,requestr?…r@}rA(hUhj;ubah(h¯ubhGX$, with one line for each test. The rB…rC}rD(hX$, with one line for each test. The hj)ubh§)rE}rF(hX ``testname``h*}rG(h.]h/]h-]h,]h0]uhj)h5]rHhGXtestnamerI…rJ}rK(hUhjEubah(h¯ubhGXe value is a unique test name (this value sets the name of the output file in the test results). The rL…rM}rN(hXe value is a unique test name (this value sets the name of the output file in the test results). The hj)ubh§)rO}rP(hX ``request``h*}rQ(h.]h/]h-]h,]h0]uhj)h5]rRhGXrequestrS…rT}rU(hUhjOubah(h¯ubhGX% value is the HTTP GET request. The rV…rW}rX(hX% value is the HTTP GET request. The hj)ubh§)rY}rZ(hX``PYCSW_SERVER``h*}r[(h.]h/]h-]h,]h0]uhj)h5]r\hGX PYCSW_SERVERr]…r^}r_(hUhjYubah(h¯ubhGX@ token is replaced at runtime with the URL to the pycsw install.r`…ra}rb(hX@ token is replaced at runtime with the URL to the pycsw install.hj)ubeubeubh)rc}rd(hUhhŽh!h"h(h6h*}re(h.]h/]h-]h,]rfUadding-new-testsrgah0]rhhauh3K?h4hh5]ri(h@)rj}rk(hXAdding New Testsrlhjch!h"h(hDh*}rm(h.]h/]h-]h,]h0]uh3K?h4hh5]rnhGXAdding New Testsro…rp}rq(hjlhjjubaubh`)rr}rs(hX"To add tests to an existing suite:rthjch!h"h(hdh*}ru(h.]h/]h-]h,]h0]uh3KAh4hh5]rvhGX"To add tests to an existing suite:rw…rx}ry(hjthjrubaubj‘)rz}r{(hUhjch!h"h(j”h*}r|(j–X*h,]h-]h.]h/]h0]uh3KCh4hh5]r}(j˜)r~}r(hXEfor HTTP POST tests, add XML documents to ``tests/suites/suite/post``r€hjzh!h"h(jœh*}r(h.]h/]h-]h,]h0]uh3Nh4hh5]r‚h`)rƒ}r„(hj€hj~h!h"h(hdh*}r…(h.]h/]h-]h,]h0]uh3KCh5]r†(hGX*for HTTP POST tests, add XML documents to r‡…rˆ}r‰(hX*for HTTP POST tests, add XML documents to hjƒubh§)rŠ}r‹(hX``tests/suites/suite/post``h*}rŒ(h.]h/]h-]h,]h0]uhjƒh5]rhGXtests/suites/suite/postrŽ…r}r(hUhjŠubah(h¯ubeubaubj˜)r‘}r’(hXWfor HTTP GET tests, add tests (one per line) to ``tests/suites/suite/get/requests.txt``r“hjzh!h"h(jœh*}r”(h.]h/]h-]h,]h0]uh3Nh4hh5]r•h`)r–}r—(hj“hj‘h!h"h(hdh*}r˜(h.]h/]h-]h,]h0]uh3KDh5]r™(hGX0for HTTP GET tests, add tests (one per line) to rš…r›}rœ(hX0for HTTP GET tests, add tests (one per line) to hj–ubh§)r}rž(hX'``tests/suites/suite/get/requests.txt``h*}rŸ(h.]h/]h-]h,]h0]uhj–h5]r hGX#tests/suites/suite/get/requests.txtr¡…r¢}r£(hUhjubah(h¯ubeubaubj˜)r¤}r¥(hXrun ``paver test`` hjzh!h"h(jœh*}r¦(h.]h/]h-]h,]h0]uh3Nh4hh5]r§h`)r¨}r©(hXrun ``paver test``hj¤h!h"h(hdh*}rª(h.]h/]h-]h,]h0]uh3KEh5]r«(hGXrun r¬…r­}r®(hXrun hj¨ubh§)r¯}r°(hX``paver test``h*}r±(h.]h/]h-]h,]h0]uhj¨h5]r²hGX paver testr³…r´}rµ(hUhj¯ubah(h¯ubeubaubeubh`)r¶}r·(hXTo add a new test suite:r¸hjch!h"h(hdh*}r¹(h.]h/]h-]h,]h0]uh3KGh4hh5]rºhGXTo add a new test suite:r»…r¼}r½(hj¸hj¶ubaubj‘)r¾}r¿(hUhjch!h"h(j”h*}rÀ(j–X*h,]h-]h.]h/]h0]uh3KIh4hh5]rÁ(j˜)rÂ}rÃ(hX<create a new directory under ``tests/suites`` (e.g. ``foo``)rÄhj¾h!h"h(jœh*}rÅ(h.]h/]h-]h,]h0]uh3Nh4hh5]rÆh`)rÇ}rÈ(hjÄhjÂh!h"h(hdh*}rÉ(h.]h/]h-]h,]h0]uh3KIh5]rÊ(hGXcreate a new directory under rË…rÌ}rÍ(hXcreate a new directory under hjÇubh§)rÎ}rÏ(hX``tests/suites``h*}rÐ(h.]h/]h-]h,]h0]uhjÇh5]rÑhGX tests/suitesrÒ…rÓ}rÔ(hUhjÎubah(h¯ubhGX (e.g. rÕ…rÖ}r×(hX (e.g. hjÇubh§)rØ}rÙ(hX``foo``h*}rÚ(h.]h/]h-]h,]h0]uhjÇh5]rÛhGXfoorÜ…rÝ}rÞ(hUhjØubah(h¯ubhGX)…rß}rà(hX)hjÇubeubaubj˜)rá}râ(hXWcreate a new configuration in ``tests/suites/foo/default.cfg`` * Ensure that all file paths are relative to ``path/to/pycsw`` * Ensure that ``repository.database`` points to an SQLite3 database called ``tests/suites/foo/data/records.db``. The database *must* be called ``records.db`` and the directory ``tests/suites/foo/data`` *must* exist hj¾h!Nh(jœh*}rã(h.]h/]h-]h,]h0]uh3Nh4hh5]rä(h`)rå}ræ(hX>create a new configuration in ``tests/suites/foo/default.cfg``rçhjáh!h"h(hdh*}rè(h.]h/]h-]h,]h0]uh3KJh5]ré(hGXcreate a new configuration in rê…rë}rì(hXcreate a new configuration in hjåubh§)rí}rî(hX ``tests/suites/foo/default.cfg``h*}rï(h.]h/]h-]h,]h0]uhjåh5]rðhGXtests/suites/foo/default.cfgrñ…rò}ró(hUhjíubah(h¯ubeubj‘)rô}rõ(hUh*}rö(j–X*h,]h-]h.]h/]h0]uhjáh5]r÷(j˜)rø}rù(hX<Ensure that all file paths are relative to ``path/to/pycsw``rúh*}rû(h.]h/]h-]h,]h0]uhjôh5]rüh`)rý}rþ(hjúhjøh!h"h(hdh*}rÿ(h.]h/]h-]h,]h0]uh3KLh5]r(hGX+Ensure that all file paths are relative to r…r}r(hX+Ensure that all file paths are relative to hjýubh§)r}r(hX``path/to/pycsw``h*}r(h.]h/]h-]h,]h0]uhjýh5]rhGX path/to/pycswr…r }r (hUhjubah(h¯ubeubah(jœubj˜)r }r (hXÖEnsure that ``repository.database`` points to an SQLite3 database called ``tests/suites/foo/data/records.db``. The database *must* be called ``records.db`` and the directory ``tests/suites/foo/data`` *must* exist h*}r (h.]h/]h-]h,]h0]uhjôh5]rh`)r}r(hXÕEnsure that ``repository.database`` points to an SQLite3 database called ``tests/suites/foo/data/records.db``. The database *must* be called ``records.db`` and the directory ``tests/suites/foo/data`` *must* existrhj h!h"h(hdh*}r(h.]h/]h-]h,]h0]uh3KMh5]r(hGX Ensure that r…r}r(hX Ensure that hjubh§)r}r(hX``repository.database``h*}r(h.]h/]h-]h,]h0]uhjh5]rhGXrepository.databaser…r}r(hUhjubah(h¯ubhGX& points to an SQLite3 database called r…r}r (hX& points to an SQLite3 database called hjubh§)r!}r"(hX$``tests/suites/foo/data/records.db``h*}r#(h.]h/]h-]h,]h0]uhjh5]r$hGX tests/suites/foo/data/records.dbr%…r&}r'(hUhj!ubah(h¯ubhGX. The database r(…r)}r*(hX. The database hjubcdocutils.nodes emphasis r+)r,}r-(hX*must*h*}r.(h.]h/]h-]h,]h0]uhjh5]r/hGXmustr0…r1}r2(hUhj,ubah(Uemphasisr3ubhGX be called r4…r5}r6(hX be called hjubh§)r7}r8(hX``records.db``h*}r9(h.]h/]h-]h,]h0]uhjh5]r:hGX records.dbr;…r<}r=(hUhj7ubah(h¯ubhGX and the directory r>…r?}r@(hX and the directory hjubh§)rA}rB(hX``tests/suites/foo/data``h*}rC(h.]h/]h-]h,]h0]uhjh5]rDhGXtests/suites/foo/datarE…rF}rG(hUhjAubah(h¯ubhGX …rH}rI(hX hjubj+)rJ}rK(hX*must*h*}rL(h.]h/]h-]h,]h0]uhjh5]rMhGXmustrN…rO}rP(hUhjJubah(j3ubhGX existrQ…rR}rS(hX existhjubeubah(jœubeh(j”ubeubj˜)rT}rU(hX8populate HTTP POST requests in ``tests/suites/foo/post``rVhj¾h!h"h(jœh*}rW(h.]h/]h-]h,]h0]uh3Nh4hh5]rXh`)rY}rZ(hjVhjTh!h"h(hdh*}r[(h.]h/]h-]h,]h0]uh3KOh5]r\(hGXpopulate HTTP POST requests in r]…r^}r_(hXpopulate HTTP POST requests in hjYubh§)r`}ra(hX``tests/suites/foo/post``h*}rb(h.]h/]h-]h,]h0]uhjYh5]rchGXtests/suites/foo/postrd…re}rf(hUhj`ubah(h¯ubeubaubj˜)rg}rh(hXCpopulate HTTP GET requests in ``tests/suites/foo/get/requests.txt``rihj¾h!h"h(jœh*}rj(h.]h/]h-]h,]h0]uh3Nh4hh5]rkh`)rl}rm(hjihjgh!h"h(hdh*}rn(h.]h/]h-]h,]h0]uh3KPh5]ro(hGXpopulate HTTP GET requests in rp…rq}rr(hXpopulate HTTP GET requests in hjlubh§)rs}rt(hX%``tests/suites/foo/get/requests.txt``h*}ru(h.]h/]h-]h,]h0]uhjlh5]rvhGX!tests/suites/foo/get/requests.txtrw…rx}ry(hUhjsubah(h¯ubeubaubj˜)rz}r{(hX^if the testsuite requires test data, create ``tests/suites/foo/data`` are store XML file therer|hj¾h!h"h(jœh*}r}(h.]h/]h-]h,]h0]uh3Nh4hh5]r~h`)r}r€(hj|hjzh!h"h(hdh*}r(h.]h/]h-]h,]h0]uh3KQh5]r‚(hGX,if the testsuite requires test data, create rƒ…r„}r…(hX,if the testsuite requires test data, create hjubh§)r†}r‡(hX``tests/suites/foo/data``h*}rˆ(h.]h/]h-]h,]h0]uhjh5]r‰hGXtests/suites/foo/datarŠ…r‹}rŒ(hUhj†ubah(h¯ubhGX are store XML file therer…rŽ}r(hX are store XML file therehjubeubaubj˜)r}r‘(hXNrun ``paver test`` (or ``paver test -s foo`` to test only the new test suite) hj¾h!h"h(jœh*}r’(h.]h/]h-]h,]h0]uh3Nh4hh5]r“h`)r”}r•(hXMrun ``paver test`` (or ``paver test -s foo`` to test only the new test suite)r–hjh!h"h(hdh*}r—(h.]h/]h-]h,]h0]uh3KRh5]r˜(hGXrun r™…rš}r›(hXrun hj”ubh§)rœ}r(hX``paver test``h*}rž(h.]h/]h-]h,]h0]uhj”h5]rŸhGX paver testr …r¡}r¢(hUhjœubah(h¯ubhGX (or r£…r¤}r¥(hX (or hj”ubh§)r¦}r§(hX``paver test -s foo``h*}r¨(h.]h/]h-]h,]h0]uhj”h5]r©hGXpaver test -s foorª…r«}r¬(hUhj¦ubah(h¯ubhGX! to test only the new test suite)r­…r®}r¯(hX! to test only the new test suite)hj”ubeubaubeubh`)r°}r±(hXTThe new test suite database will be created automatically and used as part of tests.r²hjch!h"h(hdh*}r³(h.]h/]h-]h,]h0]uh3KTh4hh5]r´hGXTThe new test suite database will be created automatically and used as part of tests.rµ…r¶}r·(hj²hj°ubaubeubh)r¸}r¹(hUhhŽh!h"h(h6h*}rº(h.]h/]h-]h,]r»U web-testingr¼ah0]r½hauh3KWh4hh5]r¾(h@)r¿}rÀ(hX Web TestingrÁhj¸h!h"h(hDh*}rÂ(h.]h/]h-]h,]h0]uh3KWh4hh5]rÃhGX Web TestingrÄ…rÅ}rÆ(hjÁhj¿ubaubh`)rÇ}rÈ(hX±You can also use the pycsw tests via your web browser to perform sample requests against your pycsw install. The tests are is located in ``tests/``. To generate the HTML page:rÉhj¸h!h"h(hdh*}rÊ(h.]h/]h-]h,]h0]uh3KYh4hh5]rË(hGXŠYou can also use the pycsw tests via your web browser to perform sample requests against your pycsw install. The tests are is located in rÌ…rÍ}rÎ(hXŠYou can also use the pycsw tests via your web browser to perform sample requests against your pycsw install. The tests are is located in hjÇubh§)rÏ}rÐ(hX ``tests/``h*}rÑ(h.]h/]h-]h,]h0]uhjÇh5]rÒhGXtests/rÓ…rÔ}rÕ(hUhjÏubah(h¯ubhGX. To generate the HTML page:rÖ…r×}rØ(hX. To generate the HTML page:hjÇubeubhó)rÙ}rÚ(hX$ paver gen_tests_htmlhj¸h!h"h(höh*}rÛ(hø‰hùXbashhúhûh,]h-]h.]hü}h/]h0]uh3K[h4hh5]rÜhGX$ paver gen_tests_htmlrÝ…rÞ}rß(hUhjÙubaubh`)rà}rá(hX@Then navigate to ``http://host/path/to/pycsw/tests/index.html``.râhj¸h!h"h(hdh*}rã(h.]h/]h-]h,]h0]uh3K_h4hh5]rä(hGXThen navigate to rå…ræ}rç(hXThen navigate to hjàubh§)rè}ré(hX.``http://host/path/to/pycsw/tests/index.html``h*}rê(h.]h/]h-]h,]h0]uhjàh5]rëhGX*http://host/path/to/pycsw/tests/index.htmlrì…rí}rî(hUhjèubah(h¯ubhGX.…rï}rð(hX.hjàubeubh%)rñ}rò(hXd.. _`Compliance & Interoperability Testing & Evaluation Initiative`: http://cite.opengeospatial.org/h Khj¸h!h"h(h)h*}ró(hphqh,]rôU9compliance-interoperability-testing-evaluation-initiativerõah-]h.]h/]h0]röhauh3Kah4hh5]ubh%)r÷}rø(hX5.. _`Travis CI`: http://travis-ci.org/geopython/pycswh Khj¸h!h"h(h)h*}rù(hph¶h,]rúU travis-cirûah-]h.]h/]h0]rüh auh3Kbh4hh5]ubh%)rý}rþ(hX*.. _`Paver`: http://paver.github.io/paver/h Khj¸h!h"h(h)h*}rÿ(hpháh,]rUpaverrah-]h.]h/]h0]rh auh3Kch4hh5]ubeubeubeubh!h"h(Usystem_messagerh*}r(h.]UlevelKh,]h-]rh;aUsourceh"h/]h0]UlineKUtypeUINFOruh3Kh4hh5]rh`)r}r (hX*Duplicate implicit target name: "testing".h*}r (h.]h/]h-]h,]h0]uhhh5]r hGX*Duplicate implicit target name: "testing".r …r }r(hUhjubah(hdubaubaUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hh…hj¼hhTh jûh h“h jh h2h hhjghhÁhj?hhNhjthjõuh5]r(h&hehUU transformerrNU footnote_refsr}rUrefnamesr}r(Xpaver]rhÞaX=compliance & interoperability testing & evaluation initiative]rhkaX travis ci]rh³auUsymbol_footnotesr]rUautofootnote_refsr]r Usymbol_footnote_refsr!]r"U citationsr#]r$h4hU current_liner%NUtransform_messagesr&]r'(h)r(}r)(hUh*}r*(h.]UlevelKh,]h-]Usourceh"h/]h0]UlineKUtypejuh5]r+h`)r,}r-(hUh*}r.(h.]h/]h-]h,]h0]uhj(h5]r/hGX-Hyperlink target "testing" is not referenced.r0…r1}r2(hUhj,ubah(hdubah(jubh)r3}r4(hUh*}r5(h.]UlevelKh,]h-]Usourceh"h/]h0]UlineKUtypejuh5]r6h`)r7}r8(hUh*}r9(h.]h/]h-]h,]h0]uhj3h5]r:hGX.Hyperlink target "ogc-cite" is not referenced.r;…r<}r=(hUhj7ubah(hdubah(jubh)r>}r?(hUh*}r@(h.]UlevelKh,]h-]Usourceh"h/]h0]UlineK Utypejuh5]rAh`)rB}rC(hUh*}rD(h.]h/]h-]h,]h0]uhj>h5]rEhGX+Hyperlink target "tests" is not referenced.rF…rG}rH(hUhjBubah(hdubah(jubeUreporterrINUid_startrJKU autofootnotesrK]rLU citation_refsrM}rNUindirect_targetsrO]rPUsettingsrQ(cdocutils.frontend Values rRorS}rT(Ufootnote_backlinksrUKUrecord_dependenciesrVNU rfc_base_urlrWUhttps://tools.ietf.org/html/rXU tracebackrYˆUpep_referencesrZNUstrip_commentsr[NU toc_backlinksr\Uentryr]U language_coder^Uenr_U datestampr`NU report_levelraKU _destinationrbNU halt_levelrcKU strip_classesrdNhDNUerror_encoding_error_handlerreUbackslashreplacerfUdebugrgNUembed_stylesheetrh‰Uoutput_encoding_error_handlerriUstrictrjU sectnum_xformrkKUdump_transformsrlNU docinfo_xformrmKUwarning_streamrnNUpep_file_url_templateroUpep-%04drpUexit_status_levelrqKUconfigrrNUstrict_visitorrsNUcloak_email_addressesrtˆUtrim_footnote_reference_spaceru‰UenvrvNUdump_pseudo_xmlrwNUexpose_internalsrxNUsectsubtitle_xformry‰U source_linkrzNUrfc_referencesr{NUoutput_encodingr|Uutf-8r}U source_urlr~NUinput_encodingrU utf-8-sigr€U_disable_configrNU id_prefixr‚UU tab_widthrƒKUerror_encodingr„UUTF-8r…U_sourcer†h"Ugettext_compactr‡ˆU generatorrˆNUdump_internalsr‰NU smart_quotesrŠ‰U pep_base_urlr‹U https://www.python.org/dev/peps/rŒUsyntax_highlightrUlongrŽUinput_encoding_error_handlerrjjUauto_id_prefixrUidr‘Udoctitle_xformr’‰Ustrip_elements_with_classesr“NU _config_filesr”]Ufile_insertion_enabledr•ˆU raw_enabledr–KU dump_settingsr—NubUsymbol_footnote_startr˜KUidsr™}rš(h…hhhŽj¼j¸h“hŽjjýh2hhThOh;hjûj÷jõjñj?j;hÁh½hNhOjgjcjtjpuUsubstitution_namesr›}rœh(h4h*}r(h.]h,]h-]Usourceh"h/]h0]uU footnotesrž]rŸUrefidsr }r¡(h]r¢hŠah2]r£h&ahN]r¤hKauub.