Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TASK] Run tests on Windows and macOS as well #513

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,26 @@ on:

jobs:
tests:
name: Tests (PHP ${{ matrix.php-version }}, Composer ${{ matrix.composer-version }} & ${{ matrix.dependencies }} dependencies)
runs-on: ubuntu-latest
name: Tests (PHP ${{ matrix.php-version }}, Composer ${{ matrix.composer-version }} & ${{ matrix.dependencies }} dependencies on ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
php-version: ["8.1", "8.2", "8.3"]
composer-version: ["2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7"]
dependencies: ["highest", "lowest"]
os: ["ubuntu-latest"]
include:
# Windows tests
- php-version: "8.3"
composer-version: "2.7"
dependencies: "highest"
os: "windows-latest"
# macOS tests
- php-version: "8.3"
composer-version: "2.7"
dependencies: "highest"
os: "macos-latest"
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -28,6 +40,7 @@ jobs:
with:
php-version: ${{ matrix.php-version }}
tools: composer:v${{ matrix.composer-version }}
extensions: sockets
coverage: none

# Install dependencies
Expand All @@ -36,7 +49,7 @@ jobs:
with:
dependency-versions: ${{ matrix.dependencies }}
# Composer < 2.7 is not compatible with symfony/console 7.x
composer-options: ${{ matrix.composer-version != '2.7' && '--with symfony/console:<7' }}
composer-options: ${{ matrix.composer-version != '2.7' && '--with symfony/console:<7' || '' }}

# Run tests
- name: Run tests
Expand Down
5 changes: 2 additions & 3 deletions src/Builder/BuildInstructions.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
use ArrayObject;
use CPSIT\ProjectBuilder\Helper;
use CPSIT\ProjectBuilder\Paths;
use Symfony\Component\Filesystem;

use function dirname;

Expand Down Expand Up @@ -62,12 +61,12 @@ public function getTemplateDirectory(): string

public function getSourceDirectory(): string
{
return Filesystem\Path::join($this->getTemplateDirectory(), Paths::TEMPLATE_SOURCES);
return Helper\FilesystemHelper::path($this->getTemplateDirectory(), Paths::TEMPLATE_SOURCES);
}

public function getSharedSourceDirectory(): string
{
return Filesystem\Path::join($this->getTemplateDirectory(), Paths::TEMPLATE_SHARED_SOURCES);
return Helper\FilesystemHelper::path($this->getTemplateDirectory(), Paths::TEMPLATE_SHARED_SOURCES);
}

public function getTemporaryDirectory(): string
Expand Down
7 changes: 3 additions & 4 deletions src/Builder/Config/ConfigFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,7 @@ public function buildFromString(string $content, string $identifier, FileType $f

private function validateConfig(stdClass $parsedContent): JsonSchema\ValidationResult
{
$schemaFile = Filesystem\Path::join(Helper\FilesystemHelper::getProjectRootPath(), Paths::PROJECT_SCHEMA_CONFIG);
$schemaReference = 'file://'.$schemaFile;
$schemaFile = Helper\FilesystemHelper::path(Helper\FilesystemHelper::getProjectRootPath(), Paths::PROJECT_SCHEMA_CONFIG);
$schemaResolver = $this->validator->resolver();

// @codeCoverageIgnoreStart
Expand All @@ -110,9 +109,9 @@ private function validateConfig(stdClass $parsedContent): JsonSchema\ValidationR
}
// @codeCoverageIgnoreEnd

$schemaResolver->registerFile($schemaReference, $schemaFile);
$schemaResolver->registerFile(Paths::PROJECT_SCHEMA_REFERENCE, $schemaFile);

return $this->validator->validate($parsedContent, $schemaReference);
return $this->validator->validate($parsedContent, Paths::PROJECT_SCHEMA_REFERENCE);
}

private function generateMapperSource(string $content, string $identifier, FileType $fileType): Mapper\Source\Source
Expand Down
2 changes: 1 addition & 1 deletion src/Builder/Config/ConfigReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ private function __construct(

public static function create(?string $templateDirectory = null): self
{
$templateDirectory ??= Filesystem\Path::join(Helper\FilesystemHelper::getProjectRootPath(), Paths::PROJECT_TEMPLATES);
$templateDirectory ??= Helper\FilesystemHelper::path(Helper\FilesystemHelper::getProjectRootPath(), Paths::PROJECT_TEMPLATES);

return new self(ConfigFactory::create(), $templateDirectory);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@

use Composer\IO as ComposerIO;
use CPSIT\ProjectBuilder\Builder;
use CPSIT\ProjectBuilder\Helper;
use CPSIT\ProjectBuilder\IO;
use CPSIT\ProjectBuilder\Resource;
use Symfony\Component\Console;
use Symfony\Component\Filesystem;

/**
* InstallComposerDependenciesStep.
Expand All @@ -49,7 +49,7 @@ public function __construct(

public function run(Builder\BuildResult $buildResult): bool
{
$composerJson = Filesystem\Path::join($buildResult->getInstructions()->getTemplateDirectory(), 'composer.json');
$composerJson = Helper\FilesystemHelper::path($buildResult->getInstructions()->getTemplateDirectory(), 'composer.json');
$exitCode = $this->runComposerInstall($composerJson);

$buildResult->applyStep($this);
Expand Down
3 changes: 2 additions & 1 deletion src/Builder/Generator/Step/ProcessSharedSourceFilesStep.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
namespace CPSIT\ProjectBuilder\Builder\Generator\Step;

use CPSIT\ProjectBuilder\Builder;
use CPSIT\ProjectBuilder\Helper;
use CPSIT\ProjectBuilder\IO;
use CPSIT\ProjectBuilder\Paths;
use CPSIT\ProjectBuilder\Resource;
Expand Down Expand Up @@ -95,7 +96,7 @@ public static function supports(string $type): bool

private function listSharedSourceFiles(Builder\BuildInstructions $instructions): Finder\Finder
{
$basePath = Filesystem\Path::join(
$basePath = Helper\FilesystemHelper::path(
$instructions->getSharedSourceDirectory(),
// Include all installed shared source packages
'*',
Expand Down
5 changes: 3 additions & 2 deletions src/Console/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use CPSIT\ProjectBuilder\DependencyInjection;
use CPSIT\ProjectBuilder\Error;
use CPSIT\ProjectBuilder\Exception;
use CPSIT\ProjectBuilder\Helper;
use CPSIT\ProjectBuilder\IO;
use CPSIT\ProjectBuilder\Paths;
use CPSIT\ProjectBuilder\Resource;
Expand Down Expand Up @@ -127,8 +128,8 @@ public function run(bool $disableTemplateSourceCache = false): int
private function mirrorSourceFiles(): void
{
$this->filesystem->mirror(
Filesystem\Path::join($this->targetDirectory, Paths::PROJECT_SOURCES),
Filesystem\Path::join($this->targetDirectory, '.build', Paths::PROJECT_SOURCES),
Helper\FilesystemHelper::path($this->targetDirectory, Paths::PROJECT_SOURCES),
Helper\FilesystemHelper::path($this->targetDirectory, '.build', Paths::PROJECT_SOURCES),
);
}

Expand Down
4 changes: 2 additions & 2 deletions src/Console/Simulation.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public static function create(): self
new Resource\Local\Composer($filesystem),
Factory::createOutput(),
$rootPath,
Filesystem\Path::join($rootPath, '.build', uniqid('simulate_')),
Helper\FilesystemHelper::path($rootPath, '.build', uniqid('simulate_')),
);
}

Expand All @@ -88,7 +88,7 @@ public function prepare(): string

// Install project
$exitCode = $this->composer->install(
Filesystem\Path::join($this->targetDirectory, 'composer.json'),
Helper\FilesystemHelper::path($this->targetDirectory, 'composer.json'),
true,
$this->output,
);
Expand Down
16 changes: 7 additions & 9 deletions src/DependencyInjection/ContainerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public static function create(array $resourcePaths = []): self
public static function createFromConfig(Builder\Config\Config $config): self
{
$resourcePaths = [
Filesystem\Path::join(
Helper\FilesystemHelper::path(
Helper\FilesystemHelper::getProjectRootPath(),
Paths::PROJECT_TEMPLATES,
basename(dirname($config->getDeclaringFile())),
Expand All @@ -85,22 +85,20 @@ public static function createFromConfig(Builder\Config\Config $config): self
public static function createForTesting(string $testsRootPath = 'tests'): self
{
if (!Filesystem\Path::isAbsolute($testsRootPath)) {
$testsRootPath = Filesystem\Path::join(
$testsRootPath = Helper\FilesystemHelper::path(
Helper\FilesystemHelper::getProjectRootPath(),
$testsRootPath,
);
}
$resources = self::locateResources([
Filesystem\Path::join(
Helper\FilesystemHelper::path(
$testsRootPath,
'config',
),
]);
$containerPath = Filesystem\Path::join(
$containerPath = Helper\FilesystemHelper::path(
Helper\FilesystemHelper::getProjectRootPath(),
'var',
'cache',
'test-container.php',
'var/cache/test-container.php',
);

$filesystem = new Filesystem\Filesystem();
Expand All @@ -115,7 +113,7 @@ public function get(): DependencyInjection\ContainerInterface

if ($this->debug && null !== $this->containerPath) {
$containerXmlFilename = Filesystem\Path::getFilenameWithoutExtension($this->containerPath);
$containerXmlPath = Filesystem\Path::join(dirname($this->containerPath), $containerXmlFilename.'.xml');
$containerXmlPath = Helper\FilesystemHelper::path(dirname($this->containerPath), $containerXmlFilename.'.xml');
$container->addCompilerPass(new CompilerPass\ContainerBuilderDebugDumpPass($containerXmlPath));
}

Expand Down Expand Up @@ -185,6 +183,6 @@ private static function locateResources(array $resourcePaths = []): array

private static function getDefaultResourcePath(): string
{
return Filesystem\Path::join(Helper\FilesystemHelper::getProjectRootPath(), Paths::PROJECT_SERVICE_CONFIG);
return Helper\FilesystemHelper::path(Helper\FilesystemHelper::getProjectRootPath(), Paths::PROJECT_SERVICE_CONFIG);
}
}
15 changes: 12 additions & 3 deletions src/Helper/FilesystemHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
use Symfony\Component\Finder;

use function dirname;
use function explode;
use function getenv;
use function implode;

/**
* FilesystemHelper.
Expand All @@ -41,7 +43,7 @@ final class FilesystemHelper
public static function createFileObject(string $baseDir, string $relativePathname): Finder\SplFileInfo
{
return new Finder\SplFileInfo(
Filesystem\Path::join($baseDir, $relativePathname),
self::path($baseDir, $relativePathname),
dirname($relativePathname),
$relativePathname,
);
Expand All @@ -50,7 +52,7 @@ public static function createFileObject(string $baseDir, string $relativePathnam
public static function getNewTemporaryDirectory(): string
{
do {
$dir = Filesystem\Path::join(sys_get_temp_dir(), uniqid('cpsit_project_builder_'));
$dir = self::path(sys_get_temp_dir(), uniqid('cpsit_project_builder_'));
} while (is_dir($dir));

return $dir;
Expand All @@ -63,9 +65,16 @@ public static function getProjectRootPath(): string
}

if (null !== $rootPath) {
$rootPath = Filesystem\Path::canonicalize($rootPath);
$rootPath = self::path($rootPath);
}

return $rootPath ?? dirname(__DIR__, 2);
}

public static function path(string ...$segments): string
{
$normalizedSegments = explode('/', Filesystem\Path::join(...$segments));

return implode(DIRECTORY_SEPARATOR, $normalizedSegments);
}
}
5 changes: 5 additions & 0 deletions src/Paths.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ enum Paths
*/
final public const PROJECT_SCHEMA_CONFIG = 'resources/config.schema.json';

/**
* Internal reference to the JSON schema for template config files.
*/
final public const PROJECT_SCHEMA_REFERENCE = 'https://project-builder.cps-it.de/schema.json';

/**
* Path to service configurations.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/Resource/Local/Composer.php
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public static function createComposer(string $rootPath): \Composer\Composer

return $factory->createComposer(
new IO\NullIO(),
Filesystem\Path::join($rootPath, 'composer.json'),
Helper\FilesystemHelper::path($rootPath, 'composer.json'),
);
}
}
4 changes: 2 additions & 2 deletions src/Template/Provider/BaseProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public function __construct(
$this->composer = new Resource\Local\Composer($this->filesystem);
$this->renderer = new Environment(
new Loader\FilesystemLoader([
Filesystem\Path::join(
Helper\FilesystemHelper::path(
Helper\FilesystemHelper::getProjectRootPath(),
Paths::PROJECT_INSTALLER,
),
Expand Down Expand Up @@ -272,7 +272,7 @@ protected function createComposerJson(array $templateSources, array $repositorie
];

$targetDirectory = Helper\FilesystemHelper::getNewTemporaryDirectory();
$targetFile = Filesystem\Path::join($targetDirectory, 'composer.json');
$targetFile = Helper\FilesystemHelper::path($targetDirectory, 'composer.json');
$composerJson = $this->renderer->render('composer.json.twig', [
'templateSources' => $templateSources,
'rootDir' => Helper\FilesystemHelper::getProjectRootPath(),
Expand Down
8 changes: 8 additions & 0 deletions tests/bootstrap.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

// Assure cross-platform compatible line break is used in tests
if (!defined('LF')) {
define('LF', match (PHP_OS) {
'Windows' => "\r\n",
default => "\n",
});
}

require_once dirname(__DIR__).'/.build/vendor/autoload.php';

$factory = CPSIT\ProjectBuilder\DependencyInjection\ContainerFactory::createForTesting();
Expand Down
10 changes: 8 additions & 2 deletions tests/src/Builder/BuildInstructionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,19 @@ public function getTemplateDirectoryReturnsTemplateDirectory(): void
#[Framework\Attributes\Test]
public function getSourceDirectoryReturnsSourceDirectory(): void
{
self::assertSame(dirname(__DIR__).'/templates/src', $this->subject->getSourceDirectory());
self::assertSame(
Src\Helper\FilesystemHelper::path(dirname(__DIR__), 'templates/src'),
$this->subject->getSourceDirectory(),
);
}

#[Framework\Attributes\Test]
public function getSharedSourceDirectoryReturnsSharedSourceDirectory(): void
{
self::assertSame(dirname(__DIR__).'/templates/shared', $this->subject->getSharedSourceDirectory());
self::assertSame(
Src\Helper\FilesystemHelper::path(dirname(__DIR__), 'templates/shared'),
$this->subject->getSharedSourceDirectory(),
);
}

#[Framework\Attributes\Test]
Expand Down
18 changes: 12 additions & 6 deletions tests/src/Builder/Config/ConfigFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public function buildFromFileReturnsHydratedConfigObject(): void
);

foreach (['json', 'yaml'] as $fileType) {
$configFile = dirname(__DIR__, 2).'/Fixtures/Templates/'.$fileType.'-template/config.'.$fileType;
$configFile = Src\Helper\FilesystemHelper::path(dirname(__DIR__, 2), 'Fixtures/Templates/'.$fileType.'-template/config.'.$fileType);
$expected = $createConfig($fileType);
$expected->setDeclaringFile($configFile);

Expand All @@ -159,10 +159,16 @@ public function buildFromStringThrowsExceptionIfGivenContentIsInvalid(): void
*/
public static function buildFromFileThrowsExceptionIfFileContentsAreInvalidDataProvider(): Generator
{
$fixturePath = dirname(__DIR__, 2).'/Fixtures/Files';

yield 'invalid file' => [$fixturePath.'/invalid-config-file.yaml'];
yield 'invalid path at file condition' => [$fixturePath.'/invalid-config-file-condition-path.yaml'];
yield 'invalid target at file condition' => [$fixturePath.'/invalid-config-file-condition-target.yaml'];
$fixturePath = Src\Helper\FilesystemHelper::path(dirname(__DIR__, 2), 'Fixtures/Files');

yield 'invalid file' => [
Src\Helper\FilesystemHelper::path($fixturePath, 'invalid-config-file.yaml'),
];
yield 'invalid path at file condition' => [
Src\Helper\FilesystemHelper::path($fixturePath, 'invalid-config-file-condition-path.yaml'),
];
yield 'invalid target at file condition' => [
Src\Helper\FilesystemHelper::path($fixturePath, 'invalid-config-file-condition-target.yaml'),
];
}
}
Loading
Loading