diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-06 02:40:17 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-06 02:40:17 +0900 |
| commit | 1df28c4f702045a33865d29d00ef430d8138579b (patch) | |
| tree | 2a058de677892ad78115d59c1b9794dca4a7e5f7 /crates/shirabe/tests/plugin/fixtures/e2e-installers | |
| parent | 90764c477f24e4d67d3e0cae943c33fd2b8ae220 (diff) | |
| download | php-shirabe-1df28c4f702045a33865d29d00ef430d8138579b.tar.gz php-shirabe-1df28c4f702045a33865d29d00ef430d8138579b.tar.zst php-shirabe-1df28c4f702045a33865d29d00ef430d8138579b.zip | |
test(plugin): compare a composer/installers run against upstream Composer
The fixture project pins composer/installers 2.3.0 and requires two packages
of framework-specific types, so the plugin's LibraryInstaller subclass decides
where they land. Upstream Composer and Shirabe install the same project and
the whole resulting tree is compared.
The plugin tarball is fetched by `fixtures/e2e-installers/fetch` into a
git-ignored directory and pinned by a digest over the extracted files, so the
third-party source never enters this repository and the test skips itself
while the directory is absent. The tree is staged and only moved into place
once verified, so an unverified tree is never observable under the name the
test looks for.
Diffstat (limited to 'crates/shirabe/tests/plugin/fixtures/e2e-installers')
6 files changed, 113 insertions, 0 deletions
diff --git a/crates/shirabe/tests/plugin/fixtures/e2e-installers/fetch b/crates/shirabe/tests/plugin/fixtures/e2e-installers/fetch new file mode 100755 index 00000000..a00d9a07 --- /dev/null +++ b/crates/shirabe/tests/plugin/fixtures/e2e-installers/fetch @@ -0,0 +1,42 @@ +#!/bin/sh +# Fetches the external plugin the E2E test runs against, into the git-ignored ext/ +# directory. The plugin is pinned to an immutable upstream commit and the extracted +# files are verified by hash, so the test stays deterministic without the third-party +# source ever entering this repository. Requires network once; the E2E test skips +# itself while ext/ is absent. +set -eu + +# composer/installers v2.3.0 +commit=12fb2dfe5e16183de69e784a7b84046c43d97e8e +# GitHub archives are content-addressed by the commit, but the archive encoding is not +# guaranteed stable; the extracted files are what the test consumes, so they are what +# gets pinned. This tree holds a hundred installer classes, so the pin is one digest over +# the sorted per-file digests rather than a line per file. +expected=2f9bb837ed1374985909cf33eb1e6e33d0dc3bf1eb0c55599c7326a886bf4f50 + +ext="$(dirname "$0")/ext" +dir="$ext/composer-installers-2.3.0" + +if [ -f "$dir/src/Composer/Installers/Installer.php" ]; then + echo "already fetched: $dir" + exit 0 +fi + +# Staged next to the destination and only moved into place once verified, so a mismatched +# tree is never observable under the name the test looks for. +staging="$ext/.staging-$commit" +mkdir -p "$staging" +# The CI workflows are not part of the installed package and would only add noise to the +# digest. +curl -fsSL "https://codeload.github.com/composer/installers/tar.gz/$commit" \ + | tar -xz -C "$staging" --strip-components=1 --exclude='.github' + +actual=$(cd "$staging" && find . -type f | sort | xargs sha256sum | sha256sum | cut -d' ' -f1) +if [ "$actual" != "$expected" ]; then + echo "hash mismatch: expected $expected, got $actual" >&2 + echo "the fetched tree was left in $staging for inspection; delete it before retrying" >&2 + exit 1 +fi + +mv "$staging" "$dir" +echo "fetched: $dir" diff --git a/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-module/composer.json b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-module/composer.json new file mode 100644 index 00000000..7f55c074 --- /dev/null +++ b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-module/composer.json @@ -0,0 +1,6 @@ +{ + "name": "acme/hello-module", + "version": "1.0.0", + "type": "drupal-module", + "description": "Fixture package placed by composer/installers under modules/." +} diff --git a/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-module/src/hello.txt b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-module/src/hello.txt new file mode 100644 index 00000000..c872e5a8 --- /dev/null +++ b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-module/src/hello.txt @@ -0,0 +1 @@ +hello module payload diff --git a/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-theme/composer.json b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-theme/composer.json new file mode 100644 index 00000000..ea23f0f4 --- /dev/null +++ b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-theme/composer.json @@ -0,0 +1,6 @@ +{ + "name": "acme/hello-theme", + "version": "1.0.0", + "type": "drupal-theme", + "description": "Fixture package placed by composer/installers under themes/." +} diff --git a/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-theme/src/hello.txt b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-theme/src/hello.txt new file mode 100644 index 00000000..b2c6f073 --- /dev/null +++ b/crates/shirabe/tests/plugin/fixtures/e2e-installers/packages/hello-theme/src/hello.txt @@ -0,0 +1 @@ +hello theme payload diff --git a/crates/shirabe/tests/plugin/fixtures/e2e-installers/project/composer.json b/crates/shirabe/tests/plugin/fixtures/e2e-installers/project/composer.json new file mode 100644 index 00000000..c2793f71 --- /dev/null +++ b/crates/shirabe/tests/plugin/fixtures/e2e-installers/project/composer.json @@ -0,0 +1,57 @@ +{ + "name": "shirabe/e2e-installers", + "description": "E2E fixture project: let composer/installers place packages of a framework-specific type.", + "repositories": [ + { + "type": "package", + "package": { + "name": "composer/installers", + "version": "2.3.0", + "type": "composer-plugin", + "license": [ + "MIT" + ], + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "require": { + "php": "^7.2 || ^8.0", + "composer-plugin-api": "^1.0 || ^2.0" + }, + "extra": { + "class": "Composer\\Installers\\Plugin", + "plugin-modifies-install-path": true + }, + "dist": { + "type": "path", + "url": "../ext/composer-installers-2.3.0" + }, + "transport-options": { + "symlink": false + } + } + }, + { + "type": "path", + "url": "../packages/*", + "options": { + "symlink": false + } + }, + { + "packagist.org": false + } + ], + "require": { + "composer/installers": "2.3.0", + "acme/hello-module": "1.0.0", + "acme/hello-theme": "1.0.0" + }, + "config": { + "allow-plugins": { + "composer/installers": true + } + } +} |
