package packs

import (
	"context"
	"testing"
)

func TestOperationPackSourceOptionsAreScopedAndDetached(t *testing.T) {
	const uri = "urn:nexuscrm:pack:test"
	original := DefaultPackSourceOptions()
	original.ReleaseRepoSources = map[string]ReleaseRepoSource{
		uri: {Root: "/exact/repository/pack", Revision: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
	}
	original.ReleaseRepoStoredRevisionSources = map[string]ReleaseRepoSource{
		releaseRepoStoredRevisionAuthorityKey(uri, "cccccccccccccccccccccccccccccccccccccccc"): {
			Root: "/exact/repository/pack", Revision: "cccccccccccccccccccccccccccccccccccccccc",
		},
	}

	ctx := WithOperationPackSourceOptions(context.Background(), original)
	original.ReleaseRepoSources[uri] = ReleaseRepoSource{Root: "/mutated", Revision: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}

	resolved, ok := OperationPackSourceOptions(ctx)
	if !ok {
		t.Fatal("operation source options are unavailable")
	}
	if got := resolved.ReleaseRepoSources[uri]; got.Root != "/exact/repository/pack" || got.Revision != "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" {
		t.Fatalf("operation release authority = %#v, want frozen exact authority", got)
	}
	resolved.ReleaseRepoSources[uri] = ReleaseRepoSource{Root: "/result-mutated"}
	resolved.ReleaseRepoStoredRevisionSources[releaseRepoStoredRevisionAuthorityKey(uri, "cccccccccccccccccccccccccccccccccccccccc")] = ReleaseRepoSource{Root: "/result-mutated"}
	again, _ := OperationPackSourceOptions(ctx)
	if got := again.ReleaseRepoSources[uri].Root; got != "/exact/repository/pack" {
		t.Fatalf("operation context was mutated through a returned map: %q", got)
	}
	if got := again.ReleaseRepoStoredRevisionSources[releaseRepoStoredRevisionAuthorityKey(uri, "cccccccccccccccccccccccccccccccccccccccc")].Root; got != "/exact/repository/pack" {
		t.Fatalf("stored-revision operation authority was mutated through a returned map: %q", got)
	}
	if _, ok := OperationPackSourceOptions(context.Background()); ok {
		t.Fatal("release authority escaped into an unrelated context")
	}
}
