Source of file VersionedFiltersTest.php
Size: 9,134 Bytes - Last Modified: 2021-12-23T10:35:47+00:00
/var/www/docs.ssmods.com/process/src/tests/php/GraphQL/Resolvers/VersionedFiltersTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 | <?php namespace SilverStripe\Versioned\GraphQL\Resolvers; use SilverStripe\Dev\SapphireTest; use SilverStripe\GraphQL\Resolvers\VersionFilters; use SilverStripe\GraphQL\Schema\Schema; use SilverStripe\Versioned\Tests\GraphQL\Fake\Fake; use SilverStripe\Versioned\Versioned; use InvalidArgumentException; // GraphQL dependency is optional in versioned, // and the following implementation relies on existence of this class (in GraphQL v4) if (!class_exists(Schema::class)) { return; } class VersionedFiltersTest extends SapphireTest { protected $usesDatabase = true; protected static $extra_dataobjects = [ Fake::class, ]; protected function setUp(): void { parent::setUp(); if (!class_exists(Schema::class)) { $this->markTestSkipped('Skipped GraphQL 4 test ' . __CLASS__); } } public function testItValidatesArchiveDate() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/ArchiveDate parameter/'); $filter->validateArgs(['mode' => 'archive']); } public function testItValidatesArchiveDateFormat() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/Invalid date/'); $filter->validateArgs(['mode' => 'archive', 'archiveDate' => '01/12/2018']); } public function testItValidatesStatusParameter() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/Status parameter/'); $filter->validateArgs(['mode' => 'status']); } public function testItValidatesVersionParameter() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/Version parameter/'); $filter->validateArgs(['mode' => 'version']); } public function testItSetsReadingStateByMode() { Versioned::withVersionedMode(function () { $filter = new VersionFilters(); $filter->applyToReadingState(['mode' => Versioned::DRAFT]); $this->assertEquals(Versioned::DRAFT, Versioned::get_stage()); }); } public function testItSetsReadingStateByArchiveDate() { Versioned::withVersionedMode(function () { $filter = new VersionFilters(); $filter->applyToReadingState(['mode' => 'archive', 'archiveDate' => '2018-01-01']); $this->assertEquals('2018-01-01', Versioned::current_archived_date()); }); } public function testItFiltersByStageOnApplyToList() { $filter = new VersionFilters(); $record1 = new Fake(); $record1->Name = 'First version draft'; $record1->write(); $record2 = new Fake(); $record2->Name = 'First version live'; $record2->write(); $record2->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $list = Fake::get(); $list = $filter->applyToList($list, ['mode' => Versioned::DRAFT]); $this->assertCount(2, $list); $list = Fake::get(); $list = $filter->applyToList($list, ['mode' => Versioned::LIVE]); $this->assertCount(1, $list); } public function testItThrowsIfArchiveAndNoDateOnApplyToList() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/ArchiveDate parameter/'); $list = Fake::get(); $filter->applyToList($list, ['mode' => 'archive']); } public function testItThrowsIfArchiveAndInvalidDateOnApplyToList() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/Invalid date/'); $list = Fake::get(); $filter->applyToList($list, ['mode' => 'archive', 'archiveDate' => 'foo']); } public function testItThrowsIfVersionAndNoVersionOnApplyToList() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/Version parameter/'); $list = Fake::get(); $filter->applyToList($list, ['mode' => 'version']); } public function testItSetsArchiveQueryParamsOnApplyToList() { $filter = new VersionFilters(); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'archive', 'archiveDate' => '2016-11-08', ] ); $this->assertEquals('archive', $list->dataQuery()->getQueryParam('Versioned.mode')); $this->assertEquals('2016-11-08', $list->dataQuery()->getQueryParam('Versioned.date')); } public function testItSetsVersionQueryParamsOnApplyToList() { $filter = new VersionFilters(); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'version', 'version' => '5', ] ); $this->assertEquals('version', $list->dataQuery()->getQueryParam('Versioned.mode')); $this->assertEquals('5', $list->dataQuery()->getQueryParam('Versioned.version')); } public function testItSetsLatestVersionQueryParamsOnApplyToList() { $filter = new VersionFilters(); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'latest_versions', ] ); $this->assertEquals('latest_versions', $list->dataQuery()->getQueryParam('Versioned.mode')); } public function testItSetsAllVersionsQueryParamsOnApplyToList() { $filter = new VersionFilters(); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'all_versions', ] ); $this->assertEquals('all_versions', $list->dataQuery()->getQueryParam('Versioned.mode')); } public function testItThrowsOnNoStatusOnApplyToList() { $filter = new VersionFilters(); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessageMatches('/Status parameter/'); $list = Fake::get(); $filter->applyToList($list, ['mode' => 'status']); } public function testStatusOnApplyToList() { $filter = new VersionFilters(); $record1 = new Fake(); $record1->Name = 'Only on draft'; $record1->write(); $record2 = new Fake(); $record2->Name = 'Published'; $record2->write(); $record2->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $record3 = new Fake(); $record2->Name = 'Will be modified'; $record3->write(); $record3->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $record3->Name = 'Modified'; $record3->write(); $record4 = new Fake(); $record4->Name = 'Will be archived'; $record4->write(); $record4->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $oldID = $record4->ID; $record4->delete(); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'status', 'status' => ['modified'] ] ); $this->assertListEquals([['ID' => $record3->ID]], $list); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'status', 'status' => ['archived'] ] ); $this->assertCount(1, $list); $this->assertEquals($oldID, $list->first()->ID); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'status', 'status' => ['draft'] ] ); $this->assertCount(1, $list); $ids = $list->column('ID'); $this->assertContains($record1->ID, $ids); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'status', 'status' => ['draft', 'modified'] ] ); $this->assertCount(2, $list); $ids = $list->column('ID'); $this->assertContains($record3->ID, $ids); $this->assertContains($record1->ID, $ids); $list = Fake::get(); $list = $filter->applyToList( $list, [ 'mode' => 'status', 'status' => ['archived', 'modified'] ] ); $this->assertCount(2, $list); $ids = $list->column('ID'); $this->assertTrue(in_array($record3->ID, $ids)); $this->assertTrue(in_array($oldID, $ids)); } } |