Ctrl K
ComunidadGuías…

internal/access/release_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package access

import (
	"strings"
	"testing"

	authv1 "k8s.io/api/authorization/v1"

	"github.com/sophotechlabs/spinoza/internal/helm"
)

func askedAbout(auth *authorizer, verb, resource string) (authv1.ResourceAttributes, bool) {
	for _, one := range auth.questions() {
		if one.Verb != verb {
			continue
		}
		if one.Resource != resource {
			continue
		}
		return one, true
	}
	return authv1.ResourceAttributes{}, false
}

func TestAReleaseNothingIsRefusedForHoldsNothingBack(t *testing.T) {
	service := serviceFor(t, refusing(nil))

	result := service.ReviewRelease(t.Context(), "prod", helm.DriverSecret)

	if len(result.Refused) != 0 {
		t.Fatalf("refused = %v, want nothing held back", result.Refused)
	}
}

func TestInstallingNeedsToCreateTheReleaseObject(t *testing.T) {
	service := serviceFor(t, refusingVerb("create", "secrets", "no creating secrets"))

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if got[Install] != "no creating secrets" {
		t.Fatalf("install reason = %q, want the refused create", got[Install])
	}
}

func TestInstallingIsNotRefusedOverAnUpdate(t *testing.T) {
	service := serviceFor(t, refusingVerb("update", "secrets", "no updating secrets"))

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if _, refused := got[Install]; refused {
		t.Fatalf("install was withheld over an update it does not make: %v", got)
	}
}

func TestInstallingIsNotRefusedOverADelete(t *testing.T) {
	service := serviceFor(t, refusingVerb("delete", "secrets", "no deleting secrets"))

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if _, refused := got[Install]; refused {
		t.Fatalf("install was withheld over a delete it does not make: %v", got)
	}
}

func TestUpgradingNeedsBothTheCreateAndTheUpdate(t *testing.T) {
	create := serviceFor(t, refusingVerb("create", "secrets", "no creating secrets"))
	update := serviceFor(t, refusingVerb("update", "secrets", "no updating secrets"))

	fromCreate := reasons(create.ReviewRelease(t.Context(), "prod", helm.DriverSecret))
	fromUpdate := reasons(update.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if fromCreate[Upgrade] != "no creating secrets" {
		t.Fatalf("upgrade reason = %q, want the refused create", fromCreate[Upgrade])
	}
	if fromUpdate[Upgrade] != "no updating secrets" {
		t.Fatalf("upgrade reason = %q, want the refused update", fromUpdate[Upgrade])
	}
}

func TestRollingBackNeedsBothTheCreateAndTheUpdate(t *testing.T) {
	create := serviceFor(t, refusingVerb("create", "secrets", "no creating secrets"))
	update := serviceFor(t, refusingVerb("update", "secrets", "no updating secrets"))

	fromCreate := reasons(create.ReviewRelease(t.Context(), "prod", helm.DriverSecret))
	fromUpdate := reasons(update.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if fromCreate[Rollback] != "no creating secrets" {
		t.Fatalf("rollback reason = %q, want the refused create", fromCreate[Rollback])
	}
	if fromUpdate[Rollback] != "no updating secrets" {
		t.Fatalf("rollback reason = %q, want the refused update", fromUpdate[Rollback])
	}
}

func TestAnUpgradeIsRefusedByTheFirstVerbItNeeds(t *testing.T) {
	both := refusing(map[string]string{})
	both.refuse["create  secrets "] = "no creating secrets"
	both.refuse["update  secrets "] = "no updating secrets"
	service := serviceFor(t, both)

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if got[Upgrade] != "no creating secrets" {
		t.Fatalf("upgrade reason = %q, want the first requirement that failed", got[Upgrade])
	}
}

func TestUninstallingNeedsToDeleteTheReleaseObject(t *testing.T) {
	service := serviceFor(t, refusingVerb("delete", "secrets", "no deleting secrets"))

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if got[Uninstall] != "no deleting secrets" {
		t.Fatalf("uninstall reason = %q, want the refused delete", got[Uninstall])
	}
	for _, name := range []string{Install, Upgrade, Rollback} {
		if _, refused := got[name]; refused {
			t.Fatalf("%s was withheld over a delete it does not make: %v", name, got)
		}
	}
}

func TestUninstallingIsNotRefusedOverACreate(t *testing.T) {
	service := serviceFor(t, refusingVerb("create", "secrets", "no creating secrets"))

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if _, refused := got[Uninstall]; refused {
		t.Fatalf("uninstall was withheld over a create it does not make: %v", got)
	}
}

func TestAReleaseKeptInConfigMapsIsAskedAboutConfigMaps(t *testing.T) {
	auth := refusing(map[string]string{"create  configmaps ": "no creating configmaps"})
	service := serviceFor(t, auth)

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverConfigMap))

	if got[Install] != "no creating configmaps" {
		t.Fatalf("install reason = %q, want the refused configmap create", got[Install])
	}
	if _, asked := askedAbout(auth, "create", "secrets"); asked {
		t.Fatal("a configmap release was asked about secrets")
	}
}

func TestAnUnknownDriverIsAskedAboutAsASecret(t *testing.T) {
	auth := refusing(nil)
	service := serviceFor(t, auth)

	service.ReviewRelease(t.Context(), "prod", "sql")

	if _, asked := askedAbout(auth, "create", "secrets"); !asked {
		t.Fatalf("asked %v, want the questions helm's own default would need", auth.questions())
	}
}

func TestAReleaseIsAskedAboutByNamespaceAlone(t *testing.T) {
	auth := refusing(nil)
	service := serviceFor(t, auth)

	service.ReviewRelease(t.Context(), "prod", helm.DriverSecret)

	for _, one := range auth.questions() {
		if one.Namespace != "prod" {
			t.Fatalf("asked in %q, want the release's namespace", one.Namespace)
		}
		if one.Name != "" {
			t.Fatalf("asked about %q, want the kind in that namespace", one.Name)
		}
	}
}

func TestAReleaseIsThreeQuestions(t *testing.T) {
	auth := refusing(nil)
	service := serviceFor(t, auth)

	service.ReviewRelease(t.Context(), "prod", helm.DriverSecret)

	if auth.count() != 3 {
		t.Fatalf("asked %d questions: %v", auth.count(), auth.questions())
	}
}

func TestAnApiserverThatWillNotAnswerKeepsEveryHelmButtonUnavailable(t *testing.T) {
	service := serviceFor(t, &authorizer{broken: true})

	result := service.ReviewRelease(t.Context(), "prod", helm.DriverSecret)

	if len(result.Refused) != 4 {
		t.Fatalf("refused = %v, want every Helm action kept unavailable", result.Refused)
	}
}

func TestAHelmRefusalWithoutAReasonStillSaysWhat(t *testing.T) {
	service := serviceFor(t, refusingVerb("delete", "secrets", ""))

	got := reasons(service.ReviewRelease(t.Context(), "prod", helm.DriverSecret))

	if !strings.Contains(got[Uninstall], "you may not delete secrets") {
		t.Fatalf("uninstall reason = %q, want a sentence when the cluster gave none", got[Uninstall])
	}
}