/** * @test * @depends it_handles_basic_retrieval_operations */ function it_takes_criteria_and_handles_basic_criteria_manipulation() { // clear all criteria, see if none are applied $this->repository->clearCriteria(); $this->assertTrue($this->repository->getCriteria()->isEmpty(), "getCriteria() not empty after clearCriteria()"); $this->assertRegExp("#^select \\* from [`\"]" . static::TABLE_NAME . "[`\"]\$#i", $this->repository->query()->toSql(), "Query SQL should be totally basic after clearCriteria()"); // add new criteria, see if it is applied $criteria = $this->makeMockCriteria($this->exactly(2), 'MockCriteria', function ($query) { return $query->where(self::UNIQUE_FIELD, '1337'); }); $this->repository->pushCriteria($criteria, 'TemporaryCriteria'); $this->assertCount(1, $this->repository->getCriteria(), "getCriteria() count incorrect after pushing new Criteria"); $this->assertRegExp("#where [`\"]" . self::UNIQUE_FIELD . "[`\"] =#i", $this->repository->query()->toSql(), "Query SQL should be altered by pushing Criteria"); // set repository to ignore criteria, see if they do not get applied $this->repository->ignoreCriteria(); $this->assertNotRegExp("#where [`\"]" . self::UNIQUE_FIELD . "[`\"] =#i", $this->repository->query()->toSql(), "Query SQL should be altered by pushing Criteria"); $this->repository->ignoreCriteria(false); // remove criteria once, see if it is not applied $this->repository->removeCriteriaOnce('TemporaryCriteria'); $this->assertCount(1, $this->repository->getCriteria(), "getCriteria() should still have a count of one if only removing temporarily"); $this->assertRegExp("#^select \\* from [`\"]" . static::TABLE_NAME . "[`\"]\$#i", $this->repository->query()->toSql(), "Query SQL should be totally basic while removing Criteria once"); $this->assertRegExp("#where [`\"]" . self::UNIQUE_FIELD . "[`\"] =#i", $this->repository->query()->toSql(), "Query SQL should be altered again on next call after removing Criteria once"); // override criteria once, see if it is overridden succesfully and not called $secondCriteria = $this->makeMockCriteria($this->exactly(1), 'SecondCriteria', function ($query) { return $query->where(self::SECOND_FIELD, '12345'); }); $this->repository->pushCriteriaOnce($secondCriteria, 'TemporaryCriteria'); $sql = $this->repository->query()->toSql(); $this->assertNotRegExp("#where [`\"]" . self::UNIQUE_FIELD . "[`\"] =#i", $sql, "Query SQL should not be built using first TemporaryCriteria"); $this->assertRegExp("#where [`\"]" . self::SECOND_FIELD . "[`\"] =#i", $sql, "Query SQL should be built using the overriding Criteria"); // remove specific criteria, see if it is not applied $this->repository->removeCriteria('TemporaryCriteria'); $this->assertTrue($this->repository->getCriteria()->isEmpty(), "getCriteria() not empty after removing Criteria"); $this->assertRegExp("#^select \\* from [`\"]" . static::TABLE_NAME . "[`\"]\$#i", $this->repository->query()->toSql(), "Query SQL should be totally basic after removing Criteria"); // override criteria once, see if it is changed $criteria = $this->makeMockCriteria($this->exactly(1), 'MockCriteria', function ($query) { return $query->where(self::UNIQUE_FIELD, '1337'); }); $this->repository->pushCriteriaOnce($criteria); $this->assertTrue($this->repository->getCriteria()->isEmpty(), "getCriteria() not empty with only once Criteria pushed"); $this->assertRegExp("#where [`\"]" . self::UNIQUE_FIELD . "[`\"] =#i", $this->repository->query()->toSql(), "Query SQL should be altered by pushing Criteria once"); }