package storage

import "testing"

func TestConfigAuthorityDigestTracksOnlyObjectLocation(t *testing.T) {
	base := Config{
		Provider:        ProviderS3,
		Bucket:          "files",
		Region:          "us-east-1",
		Endpoint:        "https://objects.example.test",
		KeyPrefix:       "tenant-a",
		UsePathStyle:    true,
		AccessKeyID:     "first",
		SecretAccessKey: "secret-one",
		SessionToken:    "session-one",
	}
	first, err := ConfigAuthorityDigest(base)
	if err != nil {
		t.Fatal(err)
	}
	credentialsRotated := base
	credentialsRotated.AccessKeyID = "second"
	credentialsRotated.SecretAccessKey = "secret-two"
	credentialsRotated.SessionToken = "session-two"
	second, err := ConfigAuthorityDigest(credentialsRotated)
	if err != nil {
		t.Fatal(err)
	}
	if second != first {
		t.Fatal("credential rotation changed the non-secret object-location digest")
	}

	for name, mutate := range map[string]func(*Config){
		"bucket":   func(config *Config) { config.Bucket = "other" },
		"endpoint": func(config *Config) { config.Endpoint = "https://other.example.test" },
		"prefix":   func(config *Config) { config.KeyPrefix = "tenant-b" },
		"region":   func(config *Config) { config.Region = "eu-west-1" },
		"path style": func(config *Config) {
			config.UsePathStyle = false
		},
	} {
		t.Run(name, func(t *testing.T) {
			changed := base
			mutate(&changed)
			digest, err := ConfigAuthorityDigest(changed)
			if err != nil {
				t.Fatal(err)
			}
			if digest == first {
				t.Fatalf("%s did not change the authority digest", name)
			}
		})
	}
}

func TestConfigAuthorityDigestTracksFilesystemRoot(t *testing.T) {
	base := Config{
		Provider:       ProviderFilesystem,
		Bucket:         DefaultFilesystemBucket,
		FilesystemRoot: "/srv/nexuscrm/files-a",
	}
	first, err := ConfigAuthorityDigest(base)
	if err != nil {
		t.Fatal(err)
	}
	changed := base
	changed.FilesystemRoot = "/srv/nexuscrm/files-b"
	second, err := ConfigAuthorityDigest(changed)
	if err != nil {
		t.Fatal(err)
	}
	if first == second {
		t.Fatal("filesystem root transition did not change the authority digest")
	}
}
