123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- namespace Test\AppFramework\Db;
- use OCP\AppFramework\Db\Entity;
- use OCP\DB\Types;
- use PHPUnit\Framework\Constraint\IsType;
- /**
- * @method integer getId()
- * @method void setId(integer $id)
- * @method integer getTestId()
- * @method void setTestId(integer $id)
- * @method string getName()
- * @method void setName(string $name)
- * @method string getEmail()
- * @method void setEmail(string $email)
- * @method string getPreName()
- * @method void setPreName(string $preName)
- * @method bool getTrueOrFalse()
- * @method bool isTrueOrFalse()
- * @method void setTrueOrFalse(bool $trueOrFalse)
- * @method bool getAnotherBool()
- * @method bool isAnotherBool()
- * @method string getLongText()
- * @method void setLongText(string $longText)
- * @method \DateTime getTime()
- * @method void setTime(\DateTime $time)
- * @method \DateTimeImmutable getDatetime()
- * @method void setDatetime(\DateTimeImmutable $datetime)
- */
- class TestEntity extends Entity {
- protected $name;
- protected $email;
- protected $testId;
- protected $smallInt;
- protected $bigInt;
- protected $preName;
- protected $trueOrFalse;
- protected $anotherBool;
- protected $text;
- protected $longText;
- protected $time;
- protected $datetime;
- public function __construct($name = null) {
- $this->addType('testId', Types::INTEGER);
- $this->addType('smallInt', Types::SMALLINT);
- $this->addType('bigInt', Types::BIGINT);
- $this->addType('anotherBool', Types::BOOLEAN);
- $this->addType('text', Types::TEXT);
- $this->addType('longText', Types::BLOB);
- $this->addType('time', Types::TIME);
- $this->addType('datetime', Types::DATETIME_IMMUTABLE);
- // Legacy types
- $this->addType('trueOrFalse', 'bool');
- $this->addType('legacyInt', 'int');
- $this->addType('doubleNowFloat', 'double');
- $this->name = $name;
- }
- public function setAnotherBool(bool $anotherBool): void {
- parent::setAnotherBool($anotherBool);
- }
- }
- class EntityTest extends \Test\TestCase {
- private $entity;
- protected function setUp(): void {
- parent::setUp();
- $this->entity = new TestEntity();
- }
- public function testResetUpdatedFields(): void {
- $entity = new TestEntity();
- $entity->setId(3);
- $entity->resetUpdatedFields();
- $this->assertEquals([], $entity->getUpdatedFields());
- }
- public function testFromRow(): void {
- $row = [
- 'pre_name' => 'john',
- 'email' => 'john@something.com',
- 'another_bool' => 1,
- ];
- $this->entity = TestEntity::fromRow($row);
- $this->assertEquals($row['pre_name'], $this->entity->getPreName());
- $this->assertEquals($row['email'], $this->entity->getEmail());
- $this->assertEquals($row['another_bool'], $this->entity->getAnotherBool());
- }
- public function testGetSetId(): void {
- $id = 3;
- $this->entity->setId(3);
- $this->assertEquals($id, $this->entity->getId());
- }
- public function testColumnToPropertyNoReplacement(): void {
- $column = 'my';
- $this->assertEquals('my',
- $this->entity->columnToProperty($column));
- }
- public function testColumnToProperty(): void {
- $column = 'my_attribute';
- $this->assertEquals('myAttribute',
- $this->entity->columnToProperty($column));
- }
- public function testPropertyToColumnNoReplacement(): void {
- $property = 'my';
- $this->assertEquals('my',
- $this->entity->propertyToColumn($property));
- }
- public function testSetterMarksFieldUpdated(): void {
- $this->entity->setId(3);
- $this->assertContains('id', array_keys($this->entity->getUpdatedFields()));
- }
- public function testCallShouldOnlyWorkForGetterSetter(): void {
- $this->expectException(\BadFunctionCallException::class);
- $this->entity->something();
- }
- public function testGetterShouldFailIfAttributeNotDefined(): void {
- $this->expectException(\BadFunctionCallException::class);
- $this->entity->getTest();
- }
- public function testSetterShouldFailIfAttributeNotDefined(): void {
- $this->expectException(\BadFunctionCallException::class);
- $this->entity->setTest();
- }
- public function testFromRowShouldNotAssignEmptyArray(): void {
- $row = [];
- $entity2 = new TestEntity();
- $this->entity = TestEntity::fromRow($row);
- $this->assertEquals($entity2, $this->entity);
- }
- public function testIdGetsConvertedToInt(): void {
- $row = ['id' => '4'];
- $this->entity = TestEntity::fromRow($row);
- $this->assertSame(4, $this->entity->getId());
- }
- public function testSetType(): void {
- $row = ['testId' => '4'];
- $this->entity = TestEntity::fromRow($row);
- $this->assertSame(4, $this->entity->getTestId());
- }
- public function testFromParams(): void {
- $params = [
- 'testId' => 4,
- 'email' => 'john@doe'
- ];
- $entity = TestEntity::fromParams($params);
- $this->assertEquals($params['testId'], $entity->getTestId());
- $this->assertEquals($params['email'], $entity->getEmail());
- $this->assertTrue($entity instanceof TestEntity);
- }
- public function testSlugify(): void {
- $entity = new TestEntity();
- $entity->setName('Slugify this!');
- $this->assertEquals('slugify-this', $entity->slugify('name'));
- $entity->setName('°!"§$%&/()=?`´ß\}][{³²#\'+~*-_.:,;<>|äöüÄÖÜSlugify this!');
- $this->assertEquals('slugify-this', $entity->slugify('name'));
- }
- public function dataSetterCasts(): array {
- return [
- ['Id', '3', 3],
- ['smallInt', '3', 3],
- ['bigInt', '' . PHP_INT_MAX, PHP_INT_MAX],
- ['trueOrFalse', 0, false],
- ['trueOrFalse', 1, true],
- ['anotherBool', 0, false],
- ['anotherBool', 1, true],
- ['text', 33, '33'],
- ['longText', PHP_INT_MAX, '' . PHP_INT_MAX],
- ];
- }
- /**
- * @dataProvider dataSetterCasts
- */
- public function testSetterCasts(string $field, mixed $in, mixed $out): void {
- $entity = new TestEntity();
- $entity->{'set' . $field}($in);
- $this->assertSame($out, $entity->{'get' . $field}());
- }
- public function testSetterDoesNotCastOnNull(): void {
- $entity = new TestEntity();
- $entity->setId(null);
- $this->assertSame(null, $entity->getId());
- }
- public function testSetterConvertsResourcesToStringProperly(): void {
- $string = 'Definitely a string';
- $stream = fopen('php://memory', 'r+');
- fwrite($stream, $string);
- rewind($stream);
- $entity = new TestEntity();
- $entity->setLongText($stream);
- fclose($stream);
- $this->assertSame($string, $entity->getLongText());
- }
- public function testSetterConvertsDatetime() {
- $entity = new TestEntity();
- $entity->setDatetime('2024-08-19 15:26:00');
- $this->assertEquals(new \DateTimeImmutable('2024-08-19 15:26:00'), $entity->getDatetime());
- }
- public function testSetterDoesNotConvertNullOnDatetime() {
- $entity = new TestEntity();
- $entity->setDatetime(null);
- $this->assertNull($entity->getDatetime());
- }
- public function testSetterConvertsTime() {
- $entity = new TestEntity();
- $entity->setTime('15:26:00');
- $this->assertEquals(new \DateTime('15:26:00'), $entity->getTime());
- }
- public function testGetFieldTypes(): void {
- $entity = new TestEntity();
- $this->assertEquals([
- 'id' => Types::INTEGER,
- 'testId' => Types::INTEGER,
- 'smallInt' => Types::SMALLINT,
- 'bigInt' => Types::BIGINT,
- 'anotherBool' => Types::BOOLEAN,
- 'text' => Types::TEXT,
- 'longText' => Types::BLOB,
- 'time' => Types::TIME,
- 'datetime' => Types::DATETIME_IMMUTABLE,
- 'trueOrFalse' => Types::BOOLEAN,
- 'legacyInt' => Types::INTEGER,
- 'doubleNowFloat' => Types::FLOAT,
- ], $entity->getFieldTypes());
- }
- public function testGetItInt(): void {
- $entity = new TestEntity();
- $entity->setId(3);
- $this->assertEquals(Types::INTEGER, gettype($entity->getId()));
- }
- public function testFieldsNotMarkedUpdatedIfNothingChanges(): void {
- $entity = new TestEntity('hey');
- $entity->setName('hey');
- $this->assertEquals(0, count($entity->getUpdatedFields()));
- }
- public function testIsGetter(): void {
- $entity = new TestEntity();
- $entity->setTrueOrFalse(false);
- $entity->setAnotherBool(false);
- $this->assertThat($entity->isTrueOrFalse(), new IsType(IsType::TYPE_BOOL));
- $this->assertThat($entity->isAnotherBool(), new IsType(IsType::TYPE_BOOL));
- }
- public function testIsGetterShoudFailForOtherType(): void {
- $this->expectException(\BadFunctionCallException::class);
- $entity = new TestEntity();
- $entity->setName('hello');
- $this->assertThat($entity->isName(), new IsType(IsType::TYPE_BOOL));
- }
- }
|