package testing

import (
	"dagger.io/dagger/op"
	"dagger.io/alpine"
)

registry: {
	username: string
	secret:   string
}

TestPushContainer: {
	// Push an image with a random tag
	push: {
		ref: "daggerio/ci-test:\(random)"
		#up: [
			op.#DockerLogin & {
				registry
			},
			op.#WriteFile & {
				content: random
				dest:    "/rand"
			},
			op.#PushContainer & {
				"ref": ref
			},
		]
	}

	// Pull the image back
	pull: #up: [
		op.#FetchContainer & {
			ref: push.ref
		},
	]

	// Check the content
	check: #up: [
		op.#Load & {from: alpine.#Image},
		op.#Exec & {
			args: [
				"sh", "-c", #"""
                test "$(cat /src/rand)" = "\#(random)"
                """#,
			]
			mount: "/src": from: pull
		},
	]
}

// Ensures image metadata is preserved in a push
TestPushContainerMetadata: {
	// `docker build` using an `ENV` and push the image
	push: {
		ref: "daggerio/ci-test:\(random)-dockerbuild"
		#up: [
			op.#DockerBuild & {
				dockerfile: #"""
					FROM alpine:latest@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
					ENV CHECK \#(random)
					"""#
			},
			op.#PushContainer & {
				"ref": ref
			},
		]
	}

	// Pull the image down and make sure the ENV is preserved
	check: #up: [
		op.#FetchContainer & {
			ref: push.ref
		},
		op.#Exec & {
			args: [
				"sh", "-c", #"""
                env
                test "$CHECK" = "\#(random)"
                """#,
			]
		},
	]

	// Do a FetchContainer followed by a PushContainer, make sure
	// the ENV is preserved
	pullPush: {
		ref: "daggerio/ci-test:\(random)-pullpush"

		#up: [
			op.#FetchContainer & {
				ref: push.ref
			},
			op.#PushContainer & {
				"ref": ref
			},
		]
	}

	pullPushCheck: #up: [
		op.#FetchContainer & {
			ref: pullPush.ref
		},
		op.#Exec & {
			args: [
				"sh", "-c", #"""
                test "$CHECK" = "\#(random)"
                """#,
			]
		},
	]
}