Skip to content

Commit

Permalink
Functional testing
Browse files Browse the repository at this point in the history
  • Loading branch information
bigfoot90 committed Mar 26, 2024
1 parent 420239f commit 63b812a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 36 deletions.
2 changes: 1 addition & 1 deletion src/Types/EnumType.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public function convertToPHPValue(mixed $value, AbstractPlatform $platform): mix
}

if (! is_string($value)) {
throw InvalidFormat::new($value, $this->name, ['null', 'string']);
throw InvalidFormat::new($value, $this->name, 'string');

Check warning on line 112 in src/Types/EnumType.php

View check run for this annotation

Codecov / codecov/patch

src/Types/EnumType.php#L112

Added line #L112 was not covered by tests
}

if ($this->enumClassname === null) {
Expand Down
13 changes: 9 additions & 4 deletions tests/Functional/Schema/MySQL/ComparatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Tests\Functional\Schema\ComparatorTestUtils;
use Doctrine\DBAL\Tests\FunctionalTestCase;
use Doctrine\DBAL\Tests\Types\EnumObject;
use Doctrine\DBAL\Tests\Types\EnumNative;
use Doctrine\DBAL\Tests\Types\EnumNativeBacked;
use Doctrine\DBAL\Types\EnumType;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\Types;
use PHPUnit\Framework\Attributes\DataProvider;

Expand Down Expand Up @@ -215,19 +220,19 @@ public function testMariaDb1043NativeJsonUpgradeDetected(): void
ComparatorTestUtils::assertDiffNotEmpty($this->connection, $this->comparator, $table);
}

public function testNativeEnumUpgradeDetected(): void
public function testEnumDiffDetected(): void
{
if (! $this->platform instanceof MySQLPlatform) {
self::markTestSkipped();
}

$table = new Table('mariadb_enum_upgrade');
$table = new Table('enum_test_table');

$table->addColumn('enum_col', Types::ENUM, ['members' => ['a', 'b']]);
$this->dropAndCreateTable($table);

// Revert column to old LONGTEXT declaration
$sql = 'ALTER TABLE mariadb_json_upgrade CHANGE json_col json_col LONGTEXT NOT NULL COMMENT \'(DC2Type:json)\'';
// Revert column to previous ENUM declaration
$sql = 'ALTER TABLE enum_test_table CHANGE enum_col enum_col ENUM(\'NOT_A_MEMBER_ANYMORE\') NOT NULL';
$this->connection->executeStatement($sql);

ComparatorTestUtils::assertDiffNotEmpty($this->connection, $this->comparator, $table);
Expand Down
62 changes: 31 additions & 31 deletions tests/Types/EnumTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,28 +38,28 @@ public function testConvertToPHPValue(): void

public function testConvertToPHPEnum(): void
{
$this->type->enumClassname = EnumPhp::class;
$this->type->enumClassname = EnumNative::class;

self::assertInstanceOf($this->type->enumClassname, $this->type->convertToPHPValue('A', $this->platform));
self::assertSame(EnumPhp::A, $this->type->convertToPHPValue('A', $this->platform));
self::assertSame(EnumNative::A, $this->type->convertToPHPValue('A', $this->platform));
self::assertNull($this->type->convertToPHPValue(null, $this->platform));
}

public function testConvertToPHPEnumBacked(): void
{
$this->type->enumClassname = EnumPhpBacked::class;
$this->type->enumClassname = EnumNativeBacked::class;

self::assertInstanceOf($this->type->enumClassname, $this->type->convertToPHPValue('a', $this->platform));
self::assertSame(EnumPhpBacked::A, $this->type->convertToPHPValue('a', $this->platform));
self::assertSame(EnumNativeBacked::A, $this->type->convertToPHPValue('a', $this->platform));
self::assertNull($this->type->convertToPHPValue(null, $this->platform));
}

public function testConvertToPHPObject(): void
{
$this->type->enumClassname = EnumClass::class;
$this->type->enumClassname = EnumObject::class;

self::assertInstanceOf($this->type->enumClassname, $this->type->convertToPHPValue('a', $this->platform));
self::assertEquals(new EnumClass('a'), $this->type->convertToPHPValue('a', $this->platform));
self::assertEquals(new EnumObject('a'), $this->type->convertToPHPValue('a', $this->platform));
self::assertNull($this->type->convertToPHPValue(null, $this->platform));
}

Expand All @@ -73,25 +73,25 @@ public function testConvertStringToDatabaseValue(): void

public function testConvertEnumToDatabaseValue(): void
{
$this->type->enumClassname = EnumPhp::class;
$this->type->enumClassname = EnumNative::class;

self::assertSame('A', $this->type->convertToDatabaseValue(EnumPhp::A, $this->platform));
self::assertSame('A', $this->type->convertToDatabaseValue(EnumNative::A, $this->platform));
self::assertNull($this->type->convertToDatabaseValue(null, $this->platform));
}

public function testConvertEnumBackedToDatabaseValue(): void
{
$this->type->enumClassname = EnumPhpBacked::class;
$this->type->enumClassname = EnumNativeBacked::class;

self::assertSame('a', $this->type->convertToDatabaseValue(EnumPhpBacked::A, $this->platform));
self::assertSame('a', $this->type->convertToDatabaseValue(EnumNativeBacked::A, $this->platform));
self::assertNull($this->type->convertToDatabaseValue(null, $this->platform));
}

public function testConvertObjectToDatabaseValue(): void
{
$this->type->enumClassname = EnumClass::class;
$this->type->enumClassname = EnumObject::class;

self::assertSame('a', $this->type->convertToDatabaseValue(new EnumClass('a'), $this->platform));
self::assertSame('a', $this->type->convertToDatabaseValue(new EnumObject('a'), $this->platform));
self::assertNull($this->type->convertToDatabaseValue(null, $this->platform));
}

Expand All @@ -111,54 +111,54 @@ public static function provideInvalidDataForEnumStringToDatabaseValueConversion(
'integer' => [17],
'string' => ['not_in_members'],
'array' => [['']],
'enum' => [EnumPhp::A],
'enum backed' => [EnumPhpBacked::A],
'enum' => [EnumNative::A],
'enum backed' => [EnumNativeBacked::A],
'object' => [new \stdClass()],
'stringable' => [new class() { function __toString() { return 'a'; }}],
];
}

#[DataProvider('provideInvalidDataForEnumPhpToDatabaseValueConversion')]
public function testEnumPhpDoesNotSupportInvalidValuesToDatabaseValueConversion($value): void
#[DataProvider('provideInvalidDataForEnumNativeToDatabaseValueConversion')]
public function testEnumNativeDoesNotSupportInvalidValuesToDatabaseValueConversion($value): void
{
$this->expectException(ConversionException::class);

$this->type->convertToDatabaseValue($value, $this->platform);
}

public static function provideInvalidDataForEnumPhpToDatabaseValueConversion()
public static function provideInvalidDataForEnumNativeToDatabaseValueConversion()
{
return [
'boolean true' => [true],
'boolean false' => [false],
'integer' => [17],
'string' => ['a'],
'array' => [['']],
'enum' => [WrongEnumPhp::WRONG],
'enum backed' => [EnumPhpBacked::A],
'enum' => [WrongEnumNative::WRONG],
'enum backed' => [EnumNativeBacked::A],
'object' => [new \stdClass()],
'stringable' => [new class() { function __toString() { return 'a'; }}],
];
}

#[DataProvider('provideInvalidDataForEnumPhpBackedToDatabaseValueConversion')]
public function testEnumPhpBackedDoesNotSupportInvalidValuesToDatabaseValueConversion($value): void
#[DataProvider('provideInvalidDataForEnumNativeBackedToDatabaseValueConversion')]
public function testEnumNativeBackedDoesNotSupportInvalidValuesToDatabaseValueConversion($value): void
{
$this->expectException(ConversionException::class);

$this->type->convertToDatabaseValue($value, $this->platform);
}

public static function provideInvalidDataForEnumPhpBackedToDatabaseValueConversion()
public static function provideInvalidDataForEnumNativeBackedToDatabaseValueConversion()
{
return [
'boolean true' => [true],
'boolean false' => [false],
'integer' => [17],
'string' => ['a'],
'array' => [['']],
'enum' => [EnumPhp::A],
'enum backed' => [WrongEnumPhpBacked::WRONG],
'enum' => [EnumNative::A],
'enum backed' => [WrongEnumNativeBacked::WRONG],
'object' => [new \stdClass()],
'stringable' => [new class() { function __toString() { return 'a'; }}],
];
Expand All @@ -180,8 +180,8 @@ public static function provideInvalidDataForEnumObjectToDatabaseValueConversion(
'integer' => [17],
'string' => ['a'],
'array' => [['']],
'enum' => [EnumPhp::A],
'enum backed' => [EnumPhpBacked::A],
'enum' => [EnumNative::A],
'enum backed' => [EnumNativeBacked::A],
'object' => [new \stdClass()],
'stringable' => [new class() { function __toString() { return 'a'; }}],
];
Expand All @@ -197,29 +197,29 @@ public function testInvalidValueForDatabaseValueToEnumStringConversion(): void
}
}

enum EnumPhp
enum EnumNative
{
case A;
case B;
}

enum WrongEnumPhp
enum WrongEnumNative
{
case WRONG;
}

enum EnumPhpBacked: string
enum EnumNativeBacked: string
{
case A = 'a';
case B = 'b';
}

enum WrongEnumPhpBacked: string
enum WrongEnumNativeBacked: string
{
case WRONG = 'wrong';
}

final class EnumClass implements Stringable
final class EnumObject implements Stringable
{
public function __construct(
private string $value,
Expand Down

0 comments on commit 63b812a

Please sign in to comment.