xref: /plugin/struct/_test/StructTest.php (revision 6f023786c1c663521843bb4140ddac5ce47a93b8)
128318177SAndreas Gohr<?php
228318177SAndreas Gohr
3ba766201SAndreas Gohrnamespace dokuwiki\plugin\struct\test;
428318177SAndreas Gohr
5ea9843dcSAndreas Gohruse dokuwiki\plugin\struct\meta\AccessTable;
6add73e0aSAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments;
7ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\SchemaImporter;
828318177SAndreas Gohr
928318177SAndreas Gohr/**
1028318177SAndreas Gohr * Base class for all struct tests
1128318177SAndreas Gohr *
1228318177SAndreas Gohr * It cleans up the database in teardown and provides some useful helper methods
1328318177SAndreas Gohr *
14ba766201SAndreas Gohr * @package dokuwiki\plugin\struct\test
1528318177SAndreas Gohr */
1628318177SAndreas Gohrabstract class StructTest extends \DokuWikiTest {
1728318177SAndreas Gohr
1828318177SAndreas Gohr    /** @var array alway enable the needed plugins */
1928318177SAndreas Gohr    protected $pluginsEnabled = array('struct', 'sqlite');
2028318177SAndreas Gohr
2128318177SAndreas Gohr    /**
2228318177SAndreas Gohr     * Default teardown
2328318177SAndreas Gohr     *
2428318177SAndreas Gohr     * we always make sure the database is clear
2528318177SAndreas Gohr     */
2628318177SAndreas Gohr    protected function tearDown() {
2728318177SAndreas Gohr        parent::tearDown();
289d580426SAndreas Gohr        /** @var \helper_plugin_struct_db $db */
299d580426SAndreas Gohr        $db = plugin_load('helper', 'struct_db');
309d580426SAndreas Gohr        $db->resetDB();
3128318177SAndreas Gohr    }
3228318177SAndreas Gohr
3328318177SAndreas Gohr    /**
3428318177SAndreas Gohr     * Creates a schema from one of the available schema files
3528318177SAndreas Gohr     *
3628318177SAndreas Gohr     * @param string $schema
3728318177SAndreas Gohr     * @param string $json base name of the JSON file optional, defaults to $schema
389d580426SAndreas Gohr     * @param int $rev allows to create schemas back in time
39*6f023786SAndreas Gohr     * @param bool $lookup create as a lookup schema
4028318177SAndreas Gohr     */
41*6f023786SAndreas Gohr    protected function loadSchemaJSON($schema, $json = '', $rev = 0, $lookup = false) {
4228318177SAndreas Gohr        if(!$json) $json = $schema;
4328318177SAndreas Gohr        $file = __DIR__ . "/json/$json.struct.json";
4428318177SAndreas Gohr        if(!file_exists($file)) {
4528318177SAndreas Gohr            throw new \RuntimeException("$file does not exist");
4628318177SAndreas Gohr        }
4728318177SAndreas Gohr
48*6f023786SAndreas Gohr        $importer = new SchemaImporter($schema, file_get_contents($file), $lookup);
4928318177SAndreas Gohr
509d580426SAndreas Gohr        if(!$importer->build($rev)) {
5128318177SAndreas Gohr            throw new \RuntimeException("build of $schema from $file failed");
5228318177SAndreas Gohr        }
5328318177SAndreas Gohr    }
5428318177SAndreas Gohr
5528318177SAndreas Gohr    /**
5628318177SAndreas Gohr     * This waits until a new second has passed
5728318177SAndreas Gohr     *
5828318177SAndreas Gohr     * The very first call will return immeadiately, proceeding calls will return
599d580426SAndreas Gohr     * only after at least 1 second after the last call has passed.
6028318177SAndreas Gohr     *
619d580426SAndreas Gohr     * When passing $init=true it will not return immeadiately but use the current
629d580426SAndreas Gohr     * second as initialization. It might still return faster than a second.
639d580426SAndreas Gohr     *
649d580426SAndreas Gohr     * @param bool $init wait from now on, not from last time
6528318177SAndreas Gohr     * @return int new timestamp
6628318177SAndreas Gohr     */
679d580426SAndreas Gohr    protected function waitForTick($init = false) {
6828318177SAndreas Gohr        static $last = 0;
699d580426SAndreas Gohr        if($init) $last = time();
709d580426SAndreas Gohr
7128318177SAndreas Gohr        while($last === $now = time()) {
7228318177SAndreas Gohr            usleep(100000); //recheck in a 10th of a second
7328318177SAndreas Gohr        }
7428318177SAndreas Gohr        $last = $now;
7528318177SAndreas Gohr        return $now;
7628318177SAndreas Gohr    }
7728318177SAndreas Gohr
7828318177SAndreas Gohr    /**
7928318177SAndreas Gohr     * Saves struct data for given page and schema
8028318177SAndreas Gohr     *
819d580426SAndreas Gohr     * Please note that setting the $rev only influences the struct data timestamp,
829d580426SAndreas Gohr     * not the page and changelog entries.
839d580426SAndreas Gohr     *
8428318177SAndreas Gohr     * @param string $page
8528318177SAndreas Gohr     * @param string $schema
8628318177SAndreas Gohr     * @param array $data
879d580426SAndreas Gohr     * @param int $rev allows to override the revision timestamp
8828318177SAndreas Gohr     */
899d580426SAndreas Gohr    protected function saveData($page, $schema, $data, $rev = 0) {
909d580426SAndreas Gohr        if(!$rev) $rev = time();
919d580426SAndreas Gohr
9228318177SAndreas Gohr        saveWikiText($page, "test for $page", "saved for testing");
93ea9843dcSAndreas Gohr        $schemaData = AccessTable::byTableName($schema, $page, $rev);
9428318177SAndreas Gohr        $schemaData->saveData($data);
95add73e0aSAndreas Gohr        $assignments = new Assignments();
96add73e0aSAndreas Gohr        $assignments->assignPageSchema($page, $schema);
9728318177SAndreas Gohr    }
989d580426SAndreas Gohr
999d580426SAndreas Gohr    /**
1009d580426SAndreas Gohr     * Access the plugin's english language strings
1019d580426SAndreas Gohr     *
1029d580426SAndreas Gohr     * @param string $key
1039d580426SAndreas Gohr     * @return string
1049d580426SAndreas Gohr     */
1059d580426SAndreas Gohr    protected function getLang($key) {
1069d580426SAndreas Gohr        static $lang = null;
1079d580426SAndreas Gohr        if(is_null($lang)) {
1089d580426SAndreas Gohr            $lang = array();
1099d580426SAndreas Gohr            include(DOKU_PLUGIN . 'struct/lang/en/lang.php');
1109d580426SAndreas Gohr        }
1119d580426SAndreas Gohr        return $lang[$key];
1129d580426SAndreas Gohr    }
113df30dbf7SAndreas Gohr
114df30dbf7SAndreas Gohr    /**
115df30dbf7SAndreas Gohr     * Removes Whitespace
116df30dbf7SAndreas Gohr     *
117df30dbf7SAndreas Gohr     * Makes comparing sql statements a bit simpler as it ignores formatting
118df30dbf7SAndreas Gohr     *
119df30dbf7SAndreas Gohr     * @param $string
120df30dbf7SAndreas Gohr     * @return string
121df30dbf7SAndreas Gohr     */
122df30dbf7SAndreas Gohr    protected function cleanWS($string) {
123df30dbf7SAndreas Gohr        return preg_replace('/\s+/s', '', $string);
124df30dbf7SAndreas Gohr    }
12528318177SAndreas Gohr}
126