Skip to content

Commit 832dc09

Browse files
committed
Improve tests
1 parent 7f98cad commit 832dc09

File tree

7 files changed

+408
-81
lines changed

7 files changed

+408
-81
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Membrane\OpenAPIReader\Tests\ValueObject\Valid\V30;
6+
7+
use Membrane\OpenAPIReader\Exception\InvalidOpenAPI;
8+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesInvalidatedSchemas;
9+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesReviewedSchemas;
10+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesSimplifiedSchemas;
11+
use Membrane\OpenAPIReader\ValueObject\Partial;
12+
use Membrane\OpenAPIReader\ValueObject\Valid\Enum\Type;
13+
use Membrane\OpenAPIReader\ValueObject\Valid\Identifier;
14+
use Membrane\OpenAPIReader\ValueObject\Valid\V30\Keywords;
15+
use Membrane\OpenAPIReader\ValueObject\Valid\V30\Schema;
16+
use Membrane\OpenAPIReader\ValueObject\Valid\Validated;
17+
use Membrane\OpenAPIReader\ValueObject\Valid\Warning;
18+
use Membrane\OpenAPIReader\ValueObject\Valid\Warnings;
19+
use PHPUnit\Framework\Attributes\CoversClass;
20+
use PHPUnit\Framework\Attributes\DataProviderExternal;
21+
use PHPUnit\Framework\Attributes\Test;
22+
use PHPUnit\Framework\Attributes\TestDox;
23+
use PHPUnit\Framework\Attributes\UsesClass;
24+
use PHPUnit\Framework\TestCase;
25+
26+
#[CoversClass(Schema::class)]
27+
#[CoversClass(Partial\Schema::class)] // DTO
28+
#[CoversClass(InvalidOpenAPI::class)]
29+
#[UsesClass(Type::class)]
30+
#[UsesClass(Identifier::class)]
31+
#[UsesClass(Validated::class)]
32+
#[UsesClass(Warning::class)]
33+
#[UsesClass(Warnings::class)]
34+
class KeywordsTest extends TestCase
35+
{
36+
#[Test]
37+
#[TestDox('It reviews schema keywords for recoverable issues')]
38+
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'forV3X')]
39+
public function itReviewsKeywords(Partial\Schema $schema, Warning $warning): void
40+
{
41+
$identifier = new Identifier('sut');
42+
$sut = new Keywords($identifier, new Warnings($identifier), $schema);
43+
44+
self::assertContainsEquals($warning, $sut->getWarnings()->all());
45+
}
46+
47+
#[Test]
48+
#[TestDox('It simplifies schema keywords where possible')]
49+
#[DataProviderExternal(ProvidesSimplifiedSchemas::class, 'forV3X')]
50+
#[DataProviderExternal(ProvidesSimplifiedSchemas::class, 'forV30')]
51+
public function itSimplifiesKeywords(
52+
Partial\Schema $schema,
53+
string $propertyName,
54+
mixed $expected,
55+
): void {
56+
$identifier = new Identifier('sut');
57+
$sut = new Keywords($identifier, new Warnings($identifier), $schema);
58+
59+
self::assertEquals($expected, $sut->{$propertyName});
60+
}
61+
62+
#[Test]
63+
#[TestDox('It invalidates schema keywords for non-recoverable issues')]
64+
#[DataProviderExternal(ProvidesInvalidatedSchemas::class, 'forV3X')]
65+
#[DataProviderExternal(ProvidesInvalidatedSchemas::class, 'forV30')]
66+
public function itInvalidatesKeywords(
67+
InvalidOpenAPI $expected,
68+
Identifier $identifier,
69+
Partial\Schema $schema,
70+
): void {
71+
$warnings = new Warnings($identifier);
72+
73+
self::expectExceptionObject($expected);
74+
75+
new Keywords($identifier, $warnings, $schema);
76+
}
77+
}

tests/ValueObject/Valid/V30/SchemaTest.php

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Membrane\OpenAPIReader\Exception\InvalidOpenAPI;
99
use Membrane\OpenAPIReader\OpenAPIVersion;
1010
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesReviewedSchemas;
11+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesSimplifiedSchemas;
1112
use Membrane\OpenAPIReader\ValueObject\Limit;
1213
use Membrane\OpenAPIReader\ValueObject\Partial;
1314
use Membrane\OpenAPIReader\ValueObject\Valid\Enum\Type;
@@ -36,25 +37,22 @@
3637
class SchemaTest extends TestCase
3738
{
3839
#[Test]
39-
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV3xReviews')]
40-
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV30Reviews')]
41-
public function itReviewsSchema(Partial\Schema $schema, array $warnings): void
40+
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'forV3X')]
41+
public function itReviewsSchema(Partial\Schema $schema, Warning $warning): void
4242
{
43-
$sut = new Schema(new Identifier('test'), $schema);
43+
$sut = new Schema(new Identifier('sut'), $schema);
4444

45-
self::assertEqualsCanonicalizing($warnings, $sut->getWarnings()->all());
45+
self::assertContainsEquals($warning, $sut->getWarnings()->all());
4646
}
4747

4848
#[Test]
49-
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV3xReviews')]
50-
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV30Reviews')]
49+
#[DataProviderExternal(ProvidesSimplifiedSchemas::class, 'forV3X')]
5150
public function itSimplifiesSchema(
5251
Partial\Schema $schema,
53-
$_,
5452
string $propertyName,
5553
mixed $expected,
5654
): void {
57-
$sut = new Schema(new Identifier('test'), $schema);
55+
$sut = new Schema(new Identifier('sut'), $schema);
5856

5957
self::assertEquals($expected, $sut->value->{$propertyName});
6058
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Membrane\OpenAPIReader\Tests\ValueObject\Valid\V31;
6+
7+
use Membrane\OpenAPIReader\Exception\InvalidOpenAPI;
8+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesInvalidatedSchemas;
9+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesReviewedSchemas;
10+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesSimplifiedSchemas;
11+
use Membrane\OpenAPIReader\ValueObject\Partial;
12+
use Membrane\OpenAPIReader\ValueObject\Valid\Enum\Type;
13+
use Membrane\OpenAPIReader\ValueObject\Valid\Identifier;
14+
use Membrane\OpenAPIReader\ValueObject\Valid\V31\Keywords;
15+
use Membrane\OpenAPIReader\ValueObject\Valid\V31\Schema;
16+
use Membrane\OpenAPIReader\ValueObject\Valid\Validated;
17+
use Membrane\OpenAPIReader\ValueObject\Valid\Warning;
18+
use Membrane\OpenAPIReader\ValueObject\Valid\Warnings;
19+
use PHPUnit\Framework\Attributes\CoversClass;
20+
use PHPUnit\Framework\Attributes\DataProviderExternal;
21+
use PHPUnit\Framework\Attributes\Test;
22+
use PHPUnit\Framework\Attributes\TestDox;
23+
use PHPUnit\Framework\Attributes\UsesClass;
24+
use PHPUnit\Framework\TestCase;
25+
26+
#[CoversClass(Schema::class)]
27+
#[CoversClass(Partial\Schema::class)] // DTO
28+
#[CoversClass(InvalidOpenAPI::class)]
29+
#[UsesClass(Type::class)]
30+
#[UsesClass(Identifier::class)]
31+
#[UsesClass(Validated::class)]
32+
#[UsesClass(Warning::class)]
33+
#[UsesClass(Warnings::class)]
34+
class KeywordsTest extends TestCase
35+
{
36+
#[Test]
37+
#[TestDox('It reviews schema keywords for recoverable issues')]
38+
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'forV3X')]
39+
public function itReviewsKeywords(Partial\Schema $schema, Warning $warning): void
40+
{
41+
$identifier = new Identifier('sut');
42+
$sut = new Keywords($identifier, new Warnings($identifier), $schema);
43+
44+
self::assertContainsEquals($warning, $sut->getWarnings()->all());
45+
}
46+
47+
#[Test]
48+
#[TestDox('It simplifies schema keywords where possible')]
49+
#[DataProviderExternal(ProvidesSimplifiedSchemas::class, 'forV3X')]
50+
#[DataProviderExternal(ProvidesSimplifiedSchemas::class, 'forV31')]
51+
public function itSimplifiesKeywords(
52+
Partial\Schema $schema,
53+
string $propertyName,
54+
mixed $expected,
55+
): void {
56+
$identifier = new Identifier('sut');
57+
$sut = new Keywords($identifier, new Warnings($identifier), $schema);
58+
59+
self::assertEquals($expected, $sut->{$propertyName});
60+
}
61+
62+
#[Test]
63+
#[TestDox('It invalidates schema keywords for non-recoverable issues')]
64+
#[DataProviderExternal(ProvidesInvalidatedSchemas::class, 'forV3X')]
65+
#[DataProviderExternal(ProvidesInvalidatedSchemas::class, 'forV31')]
66+
public function itInvalidatesKeywords(
67+
InvalidOpenAPI $expected,
68+
Identifier $identifier,
69+
Partial\Schema $schema,
70+
): void {
71+
$warnings = new Warnings($identifier);
72+
73+
self::expectExceptionObject($expected);
74+
75+
new Keywords($identifier, $warnings, $schema);
76+
}
77+
}

tests/ValueObject/Valid/V31/SchemaTest.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Membrane\OpenAPIReader\Exception\InvalidOpenAPI;
99
use Membrane\OpenAPIReader\OpenAPIVersion;
1010
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesReviewedSchemas;
11+
use Membrane\OpenAPIReader\Tests\Fixtures\ProvidesSimplifiedSchemas;
1112
use Membrane\OpenAPIReader\ValueObject\Limit;
1213
use Membrane\OpenAPIReader\ValueObject\Partial;
1314
use Membrane\OpenAPIReader\ValueObject\Valid\Enum\Type;
@@ -36,21 +37,18 @@
3637
class SchemaTest extends TestCase
3738
{
3839
#[Test]
39-
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV3xReviews')]
40-
//#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV31Reviews')]
41-
public function itReviewsSchema(Partial\Schema $schema, array $warnings): void
40+
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'forV3X')]
41+
public function itReviewsSchema(Partial\Schema $schema, Warning $warning): void
4242
{
4343
$sut = new Schema(new Identifier('test'), $schema);
4444

45-
self::assertEqualsCanonicalizing($warnings, $sut->getWarnings()->all());
45+
self::assertContainsEquals($warning, $sut->getWarnings()->all());
4646
}
4747

4848
#[Test]
49-
#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV3xReviews')]
50-
//#[DataProviderExternal(ProvidesReviewedSchemas::class, 'provideV31Reviews')]
49+
#[DataProviderExternal(ProvidesSimplifiedSchemas::class, 'forV3X')]
5150
public function itSimplifiesSchema(
5251
Partial\Schema $schema,
53-
$_,
5452
string $propertyName,
5553
mixed $expected,
5654
): void {
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
6+
7+
namespace Membrane\OpenAPIReader\Tests\Fixtures;
8+
9+
use Generator;
10+
use Membrane\OpenAPIReader\Exception\InvalidOpenAPI;
11+
use Membrane\OpenAPIReader\ValueObject\Partial;
12+
use Membrane\OpenAPIReader\ValueObject\Valid\Identifier;
13+
use Membrane\OpenAPIReader\ValueObject\Valid\Warning;
14+
use Membrane\OpenAPIReader\ValueObject\Value;
15+
16+
final class ProvidesInvalidatedSchemas
17+
{
18+
/**
19+
* @return Generator<array{
20+
* 0:InvalidOpenAPI,
21+
* 1:Identifier,
22+
* 2:Partial\Schema,
23+
* }>
24+
*/
25+
public static function forV3X(): Generator
26+
{
27+
$identifier = new Identifier('sut');
28+
29+
yield 'invalid type' => [
30+
InvalidOpenAPI::invalidType($identifier, 'invalid'),
31+
$identifier,
32+
new Partial\Schema(type: 'invalid'),
33+
];
34+
35+
yield 'properties without string keys' => [
36+
InvalidOpenAPI::mustHaveStringKeys($identifier, 'properties'),
37+
$identifier,
38+
new Partial\Schema(properties: [new Partial\Schema()]),
39+
];
40+
41+
yield 'negative maxLength' => [
42+
InvalidOpenAPI::keywordMustBeNonNegativeInteger($identifier, 'maxLength'),
43+
$identifier,
44+
new Partial\Schema(maxLength: -1),
45+
];
46+
47+
yield 'negative maxItems' => [
48+
InvalidOpenAPI::keywordMustBeNonNegativeInteger($identifier, 'maxItems'),
49+
$identifier,
50+
new Partial\Schema(maxItems: -1),
51+
];
52+
53+
yield 'negative maxProperties' => [
54+
InvalidOpenAPI::keywordMustBeNonNegativeInteger($identifier, 'maxProperties'),
55+
$identifier,
56+
new Partial\Schema(maxProperties: -1),
57+
];
58+
59+
yield 'zero multipleOf' => [
60+
InvalidOpenAPI::keywordCannotBeZero($identifier, 'multipleOf'),
61+
$identifier,
62+
new Partial\Schema(multipleOf: 0),
63+
];
64+
65+
yield 'default does not conform to type' => [
66+
InvalidOpenAPI::defaultMustConformToType($identifier),
67+
$identifier,
68+
new Partial\Schema(type: 'string', default: new Value(1)),
69+
];
70+
}
71+
72+
/**
73+
* @return Generator<array{
74+
* 0:InvalidOpenAPI,
75+
* 1:Identifier,
76+
* 2:Partial\Schema,
77+
* }>
78+
*/
79+
public static function forV30(): Generator
80+
{
81+
$identifier = new Identifier('sut');
82+
83+
yield 'numeric exclusiveMaximum' => [
84+
InvalidOpenAPI::numericExclusiveMinMaxIn30($identifier, 'exclusiveMaximum'),
85+
$identifier,
86+
new Partial\Schema(exclusiveMaximum: 5),
87+
];
88+
89+
yield 'numeric exclusiveMinimum' => [
90+
InvalidOpenAPI::numericExclusiveMinMaxIn30($identifier, 'exclusiveMinimum'),
91+
$identifier,
92+
new Partial\Schema(exclusiveMinimum: 5),
93+
];
94+
}
95+
96+
/**
97+
* @return Generator<array{
98+
* 0:InvalidOpenAPI,
99+
* 1:Identifier,
100+
* 2:Partial\Schema,
101+
* }>
102+
*/
103+
public static function forV31(): Generator
104+
{
105+
$identifier = new Identifier('sut');
106+
107+
yield 'numeric exclusiveMaximum' => [
108+
InvalidOpenAPI::boolExclusiveMinMaxIn31($identifier, 'exclusiveMaximum'),
109+
$identifier,
110+
new Partial\Schema(exclusiveMaximum: true),
111+
];
112+
113+
yield 'numeric exclusiveMinimum' => [
114+
InvalidOpenAPI::boolExclusiveMinMaxIn31($identifier, 'exclusiveMinimum'),
115+
$identifier,
116+
new Partial\Schema(exclusiveMinimum: true),
117+
];
118+
}
119+
}

0 commit comments

Comments
 (0)