fix: fail missing snapshots in CI (#1842)

Prevent snapshot assertions from silently creating missing snapshots during CI runs unless --update-snapshots is enabled.
This commit is contained in:
Caleb White
2026-08-10 19:02:44 -05:00
committed by GitHub
parent 375b92e93b
commit 617226ca01
3 changed files with 57 additions and 1 deletions
+6
View File
@@ -734,6 +734,12 @@ final class Expectation
}; };
if (! $snapshots->has()) { if (! $snapshots->has()) {
if (! Snapshot::shouldCreateMissingSnapshots()) {
$filename = $snapshots->filename();
Assert::fail($message === '' ? "Snapshot is missing at [$filename]. Run Pest with --update-snapshots to create it." : $message);
}
$filename = $snapshots->save($string); $filename = $snapshots->save($string);
TestSuite::getInstance()->registerSnapshotChange("Snapshot created at [$filename]"); TestSuite::getInstance()->registerSnapshotChange("Snapshot created at [$filename]");
+45
View File
@@ -16,6 +16,36 @@ final class Snapshot implements HandlesArguments
public static bool $updateSnapshots = false; public static bool $updateSnapshots = false;
/**
* @var list<string>
*/
private const array CI_ENVIRONMENT_VARIABLES = [
'CI',
'GITHUB_ACTIONS',
'GITLAB_CI',
'CIRCLECI',
'TRAVIS',
'APPVEYOR',
'BITBUCKET_BUILD_NUMBER',
'BUILDKITE',
'TEAMCITY_VERSION',
'JENKINS_URL',
'SYSTEM_COLLECTIONURI',
'CI_NAME',
'TASKCLUSTER_ROOT_URL',
'DRONE',
'WERCKER',
'NEVERCODE',
'SEMAPHORE',
'NETLIFY',
'NOW_BUILDER',
];
public static function shouldCreateMissingSnapshots(): bool
{
return self::$updateSnapshots || ! self::runningOnCI();
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@@ -119,4 +149,19 @@ final class Snapshot implements HandlesArguments
return true; return true;
} }
private static function runningOnCI(): bool
{
if (Environment::name() === Environment::CI) {
return true;
}
foreach (self::CI_ENVIRONMENT_VARIABLES as $environmentVariable) {
if (getenv($environmentVariable) !== false) {
return true;
}
}
return false;
}
} }
+6 -1
View File
@@ -56,7 +56,12 @@ final class SnapshotRepository
file_put_contents($snapshotFilename, $snapshot); file_put_contents($snapshotFilename, $snapshot);
return str_replace(dirname($this->testsPath).'/', '', $snapshotFilename); return $this->filename();
}
public function filename(): string
{
return str_replace(dirname($this->testsPath).'/', '', $this->getSnapshotFilename());
} }
public function flush(): void public function flush(): void