| ... | @@ -1,16 +1,21 @@ | ... | @@ -1,16 +1,21 @@ |
| 1 | import * as NodeServices from "@effect/platform-node/NodeServices"; | 1 | import * as NodeServices from "@effect/platform-node/NodeServices"; |
| 2 | import { assert, it } from "@effect/vitest"; | 2 | import { assert, it } from "@effect/vitest"; |
| | 3 | import * as Config from "effect/Config"; |
| 3 | import * as ConfigProvider from "effect/ConfigProvider"; | 4 | import * as ConfigProvider from "effect/ConfigProvider"; |
| 4 | import * as Effect from "effect/Effect"; | 5 | import * as Effect from "effect/Effect"; |
| 5 | import * as FileSystem from "effect/FileSystem"; | 6 | import * as FileSystem from "effect/FileSystem"; |
| 6 | import * as Layer from "effect/Layer"; | 7 | import * as Layer from "effect/Layer"; |
| 7 | import * as Path from "effect/Path"; | 8 | import * as Path from "effect/Path"; |
| | 9 | import * as PlatformError from "effect/PlatformError"; |
| 8 | import * as Schema from "effect/Schema"; | 10 | import * as Schema from "effect/Schema"; |
| 9 | import { Command, CliError } from "effect/unstable/cli"; | 11 | import { Command, CliError } from "effect/unstable/cli"; |
| 10 | import * as TestConsole from "effect/testing/TestConsole"; | 12 | import * as TestConsole from "effect/testing/TestConsole"; |
| 11 | import { fromJsonStringPretty } from "@t3tools/shared/schemaJson"; | 13 | import { fromJsonStringPretty } from "@t3tools/shared/schemaJson"; |
| 12 | | 14 | |
| 13 | import { | 15 | import { |
| | 16 | ReleaseGitHubOutputConfigurationError, |
| | 17 | ReleaseGitHubOutputWriteError, |
| | 18 | ReleasePackageManifestError, |
| 14 | releasePackageFiles, | 19 | releasePackageFiles, |
| 15 | updateReleasePackageVersions, | 20 | updateReleasePackageVersions, |
| 16 | updateReleasePackageVersionsCommand, | 21 | updateReleasePackageVersionsCommand, |
| ... | @@ -103,6 +108,73 @@ it.layer(ScriptTestLayer)("update-release-package-versions", (it) => { | ... | @@ -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 | it.effect("accepts flags before the version positional and appends changed output", () => | 178 | it.effect("accepts flags before the version positional and appends changed output", () => |
| 107 | Effect.gen(function* () { | 179 | Effect.gen(function* () { |
| 108 | const fs = yield* FileSystem.FileSystem; | 180 | const fs = yield* FileSystem.FileSystem; |
| ... | @@ -164,9 +236,43 @@ it.layer(ScriptTestLayer)("update-release-package-versions", (it) => { | ... | @@ -164,9 +236,43 @@ it.layer(ScriptTestLayer)("update-release-package-versions", (it) => { |
| 164 | Effect.flip, | 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 | assert.equal( | 273 | assert.equal( |
| 168 | error.message, | 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 | ); |