diff --git a/github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/ContextMapping.kt b/github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/ContextMapping.kt new file mode 100644 index 0000000000..a33cb0cd00 --- /dev/null +++ b/github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/ContextMapping.kt @@ -0,0 +1,17 @@ +package io.github.typesafegithub.workflows.yaml + +import io.github.typesafegithub.workflows.domain.contexts.Contexts +import io.github.typesafegithub.workflows.domain.contexts.GithubContext +import kotlinx.serialization.json.Json + +internal fun loadContextsFromEnvVars(getenv: (String) -> String?): Contexts { + fun getEnvVarOrFail(varName: String): String = getenv(varName) ?: error("$varName should be set!") + + val githubContextRaw = getEnvVarOrFail("GHWKT_GITHUB_CONTEXT_JSON") + val githubContext = json.decodeFromString(githubContextRaw) + return Contexts( + github = githubContext, + ) +} + +private val json = Json { ignoreUnknownKeys = true } diff --git a/github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/ToYaml.kt b/github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/ToYaml.kt index 28e11058b9..c5d3215f26 100644 --- a/github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/ToYaml.kt +++ b/github-workflows-kt/src/main/kotlin/io/github/typesafegithub/workflows/yaml/ToYaml.kt @@ -5,15 +5,12 @@ import io.github.typesafegithub.workflows.domain.KotlinLogicStep import io.github.typesafegithub.workflows.domain.Mode import io.github.typesafegithub.workflows.domain.Permission import io.github.typesafegithub.workflows.domain.Workflow -import io.github.typesafegithub.workflows.domain.contexts.Contexts -import io.github.typesafegithub.workflows.domain.contexts.GithubContext import io.github.typesafegithub.workflows.dsl.toBuilder import io.github.typesafegithub.workflows.internal.relativeToAbsolute import io.github.typesafegithub.workflows.shared.internal.findGitRoot import io.github.typesafegithub.workflows.yaml.Preamble.Just import io.github.typesafegithub.workflows.yaml.Preamble.WithOriginalAfter import io.github.typesafegithub.workflows.yaml.Preamble.WithOriginalBefore -import kotlinx.serialization.json.Json import java.nio.file.Path import kotlin.io.path.absolute import kotlin.io.path.invariantSeparatorsPathString @@ -72,16 +69,6 @@ internal fun Workflow.writeToFile( } } -private fun loadContextsFromEnvVars(getenv: (String) -> String?): Contexts { - fun getEnvVarOrFail(varName: String): String = getenv(varName) ?: error("$varName should be set!") - - val githubContextRaw = getEnvVarOrFail("GHWKT_GITHUB_CONTEXT_JSON") - val githubContext = json.decodeFromString(githubContextRaw) - return Contexts( - github = githubContext, - ) -} - private fun commentify(preamble: String): String { if (preamble.isEmpty()) return "" @@ -174,5 +161,3 @@ private fun Workflow.toYamlInternal(jobsWithConsistencyCheck: List>): Map *_customArguments.toList().toTypedArray(), "jobs" to jobsWithConsistencyCheck.jobsToYaml(), ) - -private val json = Json { ignoreUnknownKeys = true } diff --git a/github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/yaml/ContextMappingTest.kt b/github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/yaml/ContextMappingTest.kt new file mode 100644 index 0000000000..895d9a418d --- /dev/null +++ b/github-workflows-kt/src/test/kotlin/io/github/typesafegithub/workflows/yaml/ContextMappingTest.kt @@ -0,0 +1,39 @@ +package io.github.typesafegithub.workflows.yaml + +import io.github.typesafegithub.workflows.domain.contexts.Contexts +import io.github.typesafegithub.workflows.domain.contexts.GithubContext +import io.github.typesafegithub.workflows.domain.contexts.GithubContextEvent +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe + +class ContextMappingTest : + FunSpec({ + test("successfully load all supported contexts with all supported fields") { + // Given + val testGithubContextJson = javaClass.getResource("/contexts/github.json")!!.readText() + + // When + val contexts = + loadContextsFromEnvVars( + getenv = mapOf( + "GHWKT_GITHUB_CONTEXT_JSON" to testGithubContextJson, + )::get, + ) + + // Then + contexts shouldBe + Contexts( + github = + GithubContext( + repository = "some-owner/some-repo", + sha = "db76dd0f1149901e1cdf60ec98d568b32fa7eb71", + ref = "refs/heads/main", + event = + GithubContextEvent( + after = "1383af4847629428f1675f5c2e81e67cc3a4efb0", + ), + event_name = "push", + ), + ) + } + }) diff --git a/github-workflows-kt/src/test/resources/contexts/github.json b/github-workflows-kt/src/test/resources/contexts/github.json new file mode 100644 index 0000000000..2ba5602e1d --- /dev/null +++ b/github-workflows-kt/src/test/resources/contexts/github.json @@ -0,0 +1,9 @@ +{ + "repository": "some-owner/some-repo", + "sha": "db76dd0f1149901e1cdf60ec98d568b32fa7eb71", + "ref": "refs/heads/main", + "event": { + "after": "1383af4847629428f1675f5c2e81e67cc3a4efb0" + }, + "event_name": "push" +} \ No newline at end of file