package modules

import "testing"

func TestCatalogMigrationIDsAreUnique(t *testing.T) {
	seen := map[string]string{}
	for _, definition := range Catalog().Definitions {
		for _, step := range definition.Migrations {
			if previous, exists := seen[step.ID]; exists {
				t.Fatalf("migration %q is declared by both %s and %s", step.ID, previous, definition.Name)
			}
			seen[step.ID] = definition.Name
		}
	}
}

func TestCatalogContainsBuiltInModulesInDependencyOrder(t *testing.T) {
	catalog := Catalog()
	if len(catalog.Definitions) != 4 {
		t.Fatalf("definitions = %d, want 4", len(catalog.Definitions))
	}
	want := []string{"system", "integration", "task", "payment"}
	for index, name := range want {
		if got := catalog.Definitions[index].Name; got != name {
			t.Fatalf("definition[%d] = %q, want %q", index, got, name)
		}
	}
	if got := catalog.MigrationSteps(); len(got) != 8 {
		t.Fatalf("module migrations = %d, want 8", len(got))
	}
	if surface := catalog.Surface(); len(surface.Menus) != 3 || len(surface.APIs) != 15 {
		t.Fatalf("admin surface = %d menus/%d APIs, want 3/15", len(surface.Menus), len(surface.APIs))
	}
	if got := catalog.DefaultTimedTasks(); len(got) != 2 {
		t.Fatalf("default timed tasks = %d, want 2", len(got))
	}
}
