| ... | ... | @@ -1,16 +1,21 @@ |
| 1 | 1 | import * as NodeServices from "@effect/platform-node/NodeServices"; |
| 2 | 2 | import { assert, it } from "@effect/vitest"; |
| 3 | import * as Config from "effect/Config"; |
| 3 | 4 | import * as ConfigProvider from "effect/ConfigProvider"; |
| 4 | 5 | import * as Effect from "effect/Effect"; |
| 5 | 6 | import * as FileSystem from "effect/FileSystem"; |
| 6 | 7 | import * as Layer from "effect/Layer"; |
| 7 | 8 | import * as Path from "effect/Path"; |
| 9 | import * as PlatformError from "effect/PlatformError"; |
| 8 | 10 | import * as Schema from "effect/Schema"; |
| 9 | 11 | import { Command, CliError } from "effect/unstable/cli"; |
| 10 | 12 | import * as TestConsole from "effect/testing/TestConsole"; |
| 11 | 13 | import { fromJsonStringPretty } from "@t3tools/shared/schemaJson"; |
| 12 | 14 | |
| 13 | 15 | import { |
| 16 | ReleaseGitHubOutputConfigurationError, |
| 17 | ReleaseGitHubOutputWriteError, |
| 18 | ReleasePackageManifestError, |
| 14 | 19 | releasePackageFiles, |
| 15 | 20 | updateReleasePackageVersions, |
| 16 | 21 | updateReleasePackageVersionsCommand, |
| ... | ... | @@ -103,6 +108,73 @@ it.layer(ScriptTestLayer)("update-release-package-versions", (it) => { |
| 103 | 108 | }), |
| 104 | 109 | ); |
| 105 | 110 | |
| 111 | it.effect("preserves manifest read context and the filesystem cause", () => |
| 112 | Effect.gen(function* () { |
| 113 | const fs = yield* FileSystem.FileSystem; |
| 114 | const path = yield* Path.Path; |
| 115 | const baseDir = yield* fs.makeTempDirectoryScoped({ |
| 116 | prefix: "update-release-package-versions-read-error-", |
| 117 | }); |
| 118 | const filePath = path.join(baseDir, releasePackageFiles[0]); |
| 119 | |
| 120 | const error = yield* updateReleasePackageVersions("1.2.3", { |
| 121 | rootDir: baseDir, |
| 122 | }).pipe(Effect.flip); |
| 123 | |
| 124 | assert.instanceOf(error, ReleasePackageManifestError); |
| 125 | assert.equal(error.operation, "read"); |
| 126 | assert.equal(error.filePath, filePath); |
| 127 | assert.instanceOf(error.cause, PlatformError.PlatformError); |
| 128 | assert.equal(error.message, `Failed to read release package manifest '${filePath}'.`); |
| 129 | }), |
| 130 | ); |
| 131 | |
| 132 | it.effect("preserves manifest decode context and the schema cause", () => |
| 133 | Effect.gen(function* () { |
| 134 | const fs = yield* FileSystem.FileSystem; |
| 135 | const path = yield* Path.Path; |
| 136 | const baseDir = yield* fs.makeTempDirectoryScoped({ |
| 137 | prefix: "update-release-package-versions-decode-error-", |
| 138 | }); |
| 139 | const filePath = path.join(baseDir, releasePackageFiles[0]); |
| 140 | |
| 141 | yield* writePackageJsonFixtures(baseDir, "0.0.1"); |
| 142 | yield* fs.writeFileString(filePath, "not json"); |
| 143 | |
| 144 | const error = yield* updateReleasePackageVersions("1.2.3", { |
| 145 | rootDir: baseDir, |
| 146 | }).pipe(Effect.flip); |
| 147 | |
| 148 | assert.equal(error.operation, "decode"); |
| 149 | assert.equal(error.filePath, filePath); |
| 150 | assert.isTrue(Schema.isSchemaError(error.cause)); |
| 151 | assert.equal(error.message, `Failed to decode release package manifest '${filePath}'.`); |
| 152 | }), |
| 153 | ); |
| 154 | |
| 155 | it.effect("preserves manifest write context and the filesystem cause", () => |
| 156 | Effect.gen(function* () { |
| 157 | const fs = yield* FileSystem.FileSystem; |
| 158 | const path = yield* Path.Path; |
| 159 | const baseDir = yield* fs.makeTempDirectoryScoped({ |
| 160 | prefix: "update-release-package-versions-write-error-", |
| 161 | }); |
| 162 | const filePath = path.join(baseDir, releasePackageFiles[0]); |
| 163 | |
| 164 | yield* writePackageJsonFixtures(baseDir, "0.0.1"); |
| 165 | yield* fs.chmod(filePath, 0o400); |
| 166 | |
| 167 | const error = yield* updateReleasePackageVersions("1.2.3", { |
| 168 | rootDir: baseDir, |
| 169 | }).pipe(Effect.flip, Effect.ensuring(fs.chmod(filePath, 0o600).pipe(Effect.orDie))); |
| 170 | |
| 171 | assert.equal(error.operation, "write"); |
| 172 | assert.equal(error.filePath, filePath); |
| 173 | assert.instanceOf(error.cause, PlatformError.PlatformError); |
| 174 | assert.equal(error.message, `Failed to write release package manifest '${filePath}'.`); |
| 175 | }), |
| 176 | ); |
| 177 | |
| 106 | 178 | it.effect("accepts flags before the version positional and appends changed output", () => |
| 107 | 179 | Effect.gen(function* () { |
| 108 | 180 | const fs = yield* FileSystem.FileSystem; |
| ... | ... | @@ -164,9 +236,43 @@ it.layer(ScriptTestLayer)("update-release-package-versions", (it) => { |
| 164 | 236 | Effect.flip, |
| 165 | 237 | ); |
| 166 | 238 | |
| 239 | assert.instanceOf(error, ReleaseGitHubOutputConfigurationError); |
| 240 | assert.instanceOf(error.cause, Config.ConfigError); |
| 241 | assert.equal( |
| 242 | error.message, |
| 243 | "Failed to resolve GITHUB_OUTPUT for release package version output.", |
| 244 | ); |
| 245 | }), |
| 246 | ); |
| 247 | |
| 248 | it.effect("preserves GITHUB_OUTPUT write context and the filesystem cause", () => |
| 249 | Effect.gen(function* () { |
| 250 | const fs = yield* FileSystem.FileSystem; |
| 251 | const baseDir = yield* fs.makeTempDirectoryScoped({ |
| 252 | prefix: "update-release-package-versions-cli-output-error-", |
| 253 | }); |
| 254 | |
| 255 | yield* writePackageJsonFixtures(baseDir, "0.0.1"); |
| 256 | |
| 257 | const error = yield* runCli(["4.0.0", "--root", baseDir, "--github-output"]).pipe( |
| 258 | Effect.provide( |
| 259 | ConfigProvider.layer( |
| 260 | ConfigProvider.fromEnv({ |
| 261 | env: { |
| 262 | GITHUB_OUTPUT: baseDir, |
| 263 | }, |
| 264 | }), |
| 265 | ), |
| 266 | ), |
| 267 | Effect.flip, |
| 268 | ); |
| 269 | |
| 270 | assert.instanceOf(error, ReleaseGitHubOutputWriteError); |
| 271 | assert.equal(error.filePath, baseDir); |
| 272 | assert.instanceOf(error.cause, PlatformError.PlatformError); |
| 167 | 273 | assert.equal( |
| 168 | 274 | error.message, |
| 169 | | 'SchemaError(Expected string, got undefined\n at ["GITHUB_OUTPUT"])', |
| 275 | `Failed to append release package version output to '${baseDir}'.`, |
| 170 | 276 | ); |
| 171 | 277 | }), |
| 172 | 278 | ); |