Skip to content

Commit

Permalink
Test TypeScript synchronization
Browse files Browse the repository at this point in the history
  • Loading branch information
cerbero90 committed Jan 12, 2025
1 parent 85ac7b7 commit 472e8f1
Show file tree
Hide file tree
Showing 9 changed files with 183 additions and 31 deletions.
2 changes: 1 addition & 1 deletion tests/Feature/EnumMakeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
Enums::setBasePath(__DIR__ . '/../Skeleton');
Enums::setPaths('app/Enums', 'domain/*/Enums');

expect(fn() => runEnum("make \"{$enum}\" CaseOne CaseTwo --backed={$backed}"))->toGenerate($enum);
expect(fn() => runEnum("make \"{$enum}\" CaseOne CaseTwo --backed={$backed}"))->toGenerate($enum, cli: true);

(fn() => self::$paths = [])->bindTo(null, Enums::class)();
(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
Expand Down
34 changes: 34 additions & 0 deletions tests/Feature/EnumTsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

use Cerbero\Enum\Enums;

it('warns that no enums were synced if invalid enums are provided', function() {
expect(runEnum('ts InvalidEnum'))
->output->toContain('No enums to synchronize.')
->status->toBe(0);
});

it('warns that no enums were synced if no enums can be found', function() {
expect(runEnum('ts --all'))
->output->toContain('No enums to synchronize.')
->status->toBe(0);
});

it('synchronizes all the discoverable enums', function() {
Enums::setBasePath(__DIR__ . '/../Skeleton');
Enums::setPaths('app/Enums', 'domain/*/Enums');

expect($namespaces = [...Enums::namespaces()])->toBe([
App\Enums\Enum1::class,
App\Enums\Enum2::class,
Domain\Common\Enums\Enum3::class,
Domain\Payouts\Enums\Enum4::class,
]);

$enums = array_map(fn($namespace) => "\"{$namespace}\"", $namespaces);

expect(fn() => runEnum('ts ' . implode(' ', $enums)))->toTypeScript($namespaces);

(fn() => self::$paths = [])->bindTo(null, Enums::class)();
(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
});
58 changes: 58 additions & 0 deletions tests/Integration/TypeScriptTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

use Cerbero\Enum\Enums;
use Cerbero\Enum\Services\TypeScript;

use function Cerbero\Enum\className;

it('creates and appends enums', function() {
Enums::setBasePath(__DIR__ . '/../Skeleton');

$enums = [
App\Enums\Enum1::class,
App\Enums\Enum2::class,
Domain\Common\Enums\Enum3::class,
];

foreach ($enums as $enum) {
expect((new TypeScript($enum))->sync())->toBeTrue();
}

expect(fn() => (new TypeScript('Domain\Payouts\Enums\Enum4'))->sync())->toTypeScript([$enum]);

(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
});

it('replaces enums', function() {
Enums::setBasePath(__DIR__ . '/../Skeleton');

$enums = [
App\Enums\Enum1::class,
App\Enums\Enum2::class,
Domain\Common\Enums\Enum3::class,
Domain\Payouts\Enums\Enum4::class,
];

foreach ($enums as $enum) {
expect((new TypeScript($enum))->sync())->toBeTrue();
}

expect(fn() => (new TypeScript('Domain\Payouts\Enums\Enum4'))->sync(overwrite: true))->toTypeScript([$enum]);

(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
});

it('creates custom TypeScript files', function(string $enum) {
Enums::setBasePath(__DIR__ . '/../Skeleton');
Enums::setTypeScript(fn (string $enum) => 'resources/js/enums/' . className($enum) . '.ts');

expect(fn() => (new TypeScript($enum))->sync())->toTypeScript([$enum], oneFile: false);

(fn() => self::$typeScript = 'resources/js/enums/index.ts')->bindTo(null, Enums::class)();
(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
})->with([
App\Enums\Enum1::class,
App\Enums\Enum2::class,
Domain\Common\Enums\Enum3::class,
Domain\Payouts\Enums\Enum4::class,
]);
81 changes: 51 additions & 30 deletions tests/Pest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,12 @@
|
*/

use Cerbero\Enum\Enums;

use function Cerbero\Enum\className;
use function Cerbero\Enum\cli;
use function Cerbero\Enum\namespaceToPath;
use function Cerbero\Enum\path;

expect()->extend('toAnnotate', function (array $enums, bool $overwrite = false) {
$oldContents = [];
Expand All @@ -38,13 +41,7 @@
}

try {
if (is_bool($value = ($this->value)())) {
expect($value)->toBeTrue();
} else {
expect($value)
->output->toContain(...$enums)
->status->toBe(0);
}
expect($this->value)->toProcessEnums($enums);

foreach ($oldContents as $filename => $oldContent) {
$stub = __DIR__ . '/stubs/annotate/' . basename($filename, '.php') . '.stub';
Expand All @@ -53,11 +50,7 @@
$stub = $path;
}

// normalize content to avoid end-of-line incompatibility between OS
$enumContent = str_replace("\r\n", "\n", file_get_contents($filename));
$stubContent = str_replace("\r\n", "\n", file_get_contents($stub));

expect($enumContent)->toBe($stubContent);
expect($filename)->toContainIgnoreEol($stub);
}
} finally {
foreach ($oldContents as $filename => $oldContent) {
Expand All @@ -66,35 +59,61 @@
}
});

expect()->extend('toGenerate', function (string $enum) {
expect(class_exists($enum))->toBeFalse();
expect()->extend('toProcessEnums', function (array $enums) {
$value = ($this->value)();

if (is_bool($value)) {
expect($value)->toBeTrue();
} else {
expect($value)
->output->toContain(...$enums)
->status->toBe(0);
}
});

expect()->extend('toContainIgnoreEol', function (string $path) {
// normalize content to avoid end-of-line incompatibility between OS
$actualContent = str_replace("\r\n", "\n", file_get_contents(path($this->value)));
$expectedContent = str_replace("\r\n", "\n", file_get_contents(path($path)));

expect($actualContent)->toBe($expectedContent);
});

$directory = 'make';
expect()->extend('toGenerate', function (string $enum, bool $cli = false) {
expect(class_exists($enum))->toBeFalse();

try {
if (is_bool($value = ($this->value)())) {
expect($value)->toBeTrue();

$directory = 'generator';
} else {
expect($value)
->output->toContain($enum)
->status->toBe(0);
}
expect($this->value)->toProcessEnums([$enum]);

$filename = namespaceToPath($enum);
$directory = $cli ? 'make' : 'generator';
$stub = sprintf('%s/stubs/%s/%s.stub', __DIR__, $directory, className($enum));

// normalize content to avoid end-of-line incompatibility between OS
$enumContent = str_replace("\r\n", "\n", file_get_contents($filename));
$stubContent = str_replace("\r\n", "\n", file_get_contents($stub));

expect($enumContent)->toBe($stubContent);
expect($filename)->toContainIgnoreEol($stub);
} finally {
file_exists($filename) && unlink($filename);
}
});

expect()->extend('toTypeScript', function (array $enums, bool $oneFile = true) {
expect($this->value)->toProcessEnums($enums);

$paths = [];

try {
foreach ($enums as $enum) {
$paths[] = $path = Enums::basePath(Enums::typeScript($enum));
$stub = sprintf('%s/stubs/ts/%s.stub', __DIR__, $oneFile ? 'enums' : className($enum));

expect($path)->toContainIgnoreEol($stub);
}
} finally {
foreach ($paths as $path) {
file_exists($path) && unlink($path);
}
}
});

/*
|--------------------------------------------------------------------------
| Functions
Expand All @@ -113,9 +132,11 @@
*/
function runEnum(string $command): stdClass
{
$paths = sprintf('--base-path="%s" --paths="%s"', Enums::basePath(), implode(',', Enums::paths()));

ob_start();

cli($command, $status);
cli("{$command} {$paths}", $status);

$output = ob_get_clean();

Expand Down
5 changes: 5 additions & 0 deletions tests/stubs/ts/Enum1.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export enum Enum1 {
One = 1,
Two = 2,
Three = 3,
}
3 changes: 3 additions & 0 deletions tests/stubs/ts/Enum2.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export enum Enum2 {

}
5 changes: 5 additions & 0 deletions tests/stubs/ts/Enum3.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export enum Enum3 {
One = 'number 1',
Two = 'number 2',
Three = 'number 3',
}
5 changes: 5 additions & 0 deletions tests/stubs/ts/Enum4.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export enum Enum4 {
One = 1,
Two = 2,
Three = 4,
}
21 changes: 21 additions & 0 deletions tests/stubs/ts/enums.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export enum Enum1 {
One = 1,
Two = 2,
Three = 3,
}

export enum Enum2 {

}

export enum Enum3 {
One = 'number 1',
Two = 'number 2',
Three = 'number 3',
}

export enum Enum4 {
One = 1,
Two = 2,
Three = 4,
}

0 comments on commit 472e8f1

Please sign in to comment.