Fork channel

Create a new channel as a copy of main.

Rename channel

Rename main to:

Delete channel

Delete main? This cannot be undone.

validation_test.go
package db

import (
	"database/sql"
	"strings"
	"testing"
)

// setupValidationDB creates an in-memory DB with a complete test hierarchy.
//
//	dataset (structured):  ds_valtest00001
//	dataset (unstructured): ds_valtest00002
//	dataset (inactive):    ds_valtest00003
//	location in ds1:       loc_valtest0001
//	location in ds2:       loc_valtest0002
//	location (inactive):   loc_valtest0003  (in ds1)
//	cluster in loc1:       cl_valtest00001
//	cluster (inactive):    cl_valtest00002  (in loc1)
//	pattern:               pat_valtest0001
//	pattern (inactive):    pat_valtest0002
func setupValidationDB(t *testing.T) *sql.DB {
	t.Helper()
	database := SetupTestDB(t)

	InsertTestDatasetWithType(t, database, "ds_valtest00001", "Val Structured", "structured")
	InsertTestDatasetWithType(t, database, "ds_valtest00002", "Val Unstructured", "unstructured")
	InsertTestDatasetWithType(t, database, "ds_valtest00003", "Val Inactive", "structured")
	mustExec(t, database, "UPDATE dataset SET active = false WHERE id = 'ds_valtest00003'")

	InsertTestLocation(t, database, "loc_valtest0001", "ds_valtest00001", "Loc Active")
	InsertTestLocation(t, database, "loc_valtest0002", "ds_valtest00002", "Loc Unstructured")
	InsertTestLocation(t, database, "loc_valtest0003", "ds_valtest00001", "Loc Inactive")
	mustExec(t, database, "UPDATE location SET active = false WHERE id = 'loc_valtest0003'")

	InsertTestCluster(t, database, "cl_valtest00001", "ds_valtest00001", "loc_valtest0001", "Cl Active")
	InsertTestCluster(t, database, "cl_valtest00002", "ds_valtest00001", "loc_valtest0001", "Cl Inactive")
	mustExec(t, database, "UPDATE cluster SET active = false WHERE id = 'cl_valtest00002'")

	InsertTestPattern(t, database, "pat_valtest0001", 300, 600)
	InsertTestPattern(t, database, "pat_valtest0002", 60, 60)
	mustExec(t, database, "UPDATE cyclic_recording_pattern SET active = false WHERE id = 'pat_valtest0002'")

	return database
}

func mustExec(t *testing.T, database *sql.DB, query string) {
	t.Helper()
	if _, err := database.Exec(query); err != nil {
		t.Fatalf("exec %q: %v", query, err)
	}
}

// --- GetDatasetType ---

func TestGetDatasetType(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("existing structured dataset", func(t *testing.T) {
		dtype, exists, err := GetDatasetType(db, "ds_valtest00001")
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if !exists {
			t.Error("expected exists=true")
		}
		if dtype != "structured" {
			t.Errorf("got %q, want structured", dtype)
		}
	})

	t.Run("existing unstructured dataset", func(t *testing.T) {
		dtype, exists, err := GetDatasetType(db, "ds_valtest00002")
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if !exists {
			t.Error("expected exists=true")
		}
		if dtype != "unstructured" {
			t.Errorf("got %q, want unstructured", dtype)
		}
	})

	t.Run("nonexistent dataset", func(t *testing.T) {
		_, exists, err := GetDatasetType(db, "ds_nonexist00")
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if exists {
			t.Error("expected exists=false for nonexistent dataset")
		}
	})
}

// --- ValidateDatasetTypeForImport ---

func TestValidateDatasetTypeForImport(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("structured dataset passes", func(t *testing.T) {
		if err := ValidateDatasetTypeForImport(db, "ds_valtest00001"); err != nil {
			t.Errorf("unexpected error: %v", err)
		}
	})

	t.Run("unstructured dataset fails", func(t *testing.T) {
		err := ValidateDatasetTypeForImport(db, "ds_valtest00002")
		if err == nil || !strings.Contains(err.Error(), "only support 'structured'") {
			t.Errorf("expected structured-only error, got: %v", err)
		}
	})

	t.Run("nonexistent dataset fails", func(t *testing.T) {
		err := ValidateDatasetTypeForImport(db, "ds_nonexist00")
		if err == nil || !strings.Contains(err.Error(), "not found") {
			t.Errorf("expected not-found error, got: %v", err)
		}
	})
}

// --- ValidateDatasetTypeUnstructured ---

func TestValidateDatasetTypeUnstructured(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("unstructured dataset passes", func(t *testing.T) {
		if err := ValidateDatasetTypeUnstructured(db, "ds_valtest00002"); err != nil {
			t.Errorf("unexpected error: %v", err)
		}
	})

	t.Run("structured dataset fails", func(t *testing.T) {
		err := ValidateDatasetTypeUnstructured(db, "ds_valtest00001")
		if err == nil || !strings.Contains(err.Error(), "only supports 'unstructured'") {
			t.Errorf("expected unstructured-only error, got: %v", err)
		}
	})

	t.Run("nonexistent dataset fails", func(t *testing.T) {
		err := ValidateDatasetTypeUnstructured(db, "ds_nonexist00")
		if err == nil || !strings.Contains(err.Error(), "not found") {
			t.Errorf("expected not-found error, got: %v", err)
		}
	})
}

// --- ValidateLocationBelongsToDataset ---

func TestValidateLocationBelongsToDataset(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("location belongs to dataset", func(t *testing.T) {
		if err := ValidateLocationBelongsToDataset(db, "loc_valtest0001", "ds_valtest00001"); err != nil {
			t.Errorf("unexpected error: %v", err)
		}
	})

	t.Run("location belongs to different dataset", func(t *testing.T) {
		err := ValidateLocationBelongsToDataset(db, "loc_valtest0001", "ds_valtest00002")
		if err == nil || !strings.Contains(err.Error(), "does not belong") {
			t.Errorf("expected mismatch error, got: %v", err)
		}
	})

	t.Run("inactive location", func(t *testing.T) {
		err := ValidateLocationBelongsToDataset(db, "loc_valtest0003", "ds_valtest00001")
		if err == nil || !strings.Contains(err.Error(), "not found or inactive") {
			t.Errorf("expected inactive error, got: %v", err)
		}
	})

	t.Run("nonexistent location", func(t *testing.T) {
		err := ValidateLocationBelongsToDataset(db, "loc_nonexist00", "ds_valtest00001")
		if err == nil {
			t.Error("expected error for nonexistent location")
		}
	})
}

// --- DatasetExistsAndActive ---

func TestDatasetExistsAndActive(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("active dataset returns name", func(t *testing.T) {
		name, err := DatasetExistsAndActive(db, "ds_valtest00001")
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if name != "Val Structured" {
			t.Errorf("got %q, want Val Structured", name)
		}
	})

	t.Run("inactive dataset fails", func(t *testing.T) {
		_, err := DatasetExistsAndActive(db, "ds_valtest00003")
		if err == nil || !strings.Contains(err.Error(), "not active") {
			t.Errorf("expected not-active error, got: %v", err)
		}
	})

	t.Run("nonexistent dataset fails", func(t *testing.T) {
		_, err := DatasetExistsAndActive(db, "ds_nonexist00")
		if err == nil || !strings.Contains(err.Error(), "does not exist") {
			t.Errorf("expected does-not-exist error, got: %v", err)
		}
	})
}

// --- LocationBelongsToDataset ---

func TestLocationBelongsToDataset(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("active location in correct dataset", func(t *testing.T) {
		name, err := LocationBelongsToDataset(db, "loc_valtest0001", "ds_valtest00001")
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if name != "Loc Active" {
			t.Errorf("got %q, want Loc Active", name)
		}
	})

	t.Run("active location in wrong dataset", func(t *testing.T) {
		_, err := LocationBelongsToDataset(db, "loc_valtest0001", "ds_valtest00002")
		if err == nil || !strings.Contains(err.Error(), "does not belong") {
			t.Errorf("expected does-not-belong error, got: %v", err)
		}
	})

	t.Run("inactive location", func(t *testing.T) {
		_, err := LocationBelongsToDataset(db, "loc_valtest0003", "ds_valtest00001")
		if err == nil || !strings.Contains(err.Error(), "not active") {
			t.Errorf("expected not-active error, got: %v", err)
		}
	})

	t.Run("nonexistent location", func(t *testing.T) {
		_, err := LocationBelongsToDataset(db, "loc_nonexist00", "ds_valtest00001")
		if err == nil || !strings.Contains(err.Error(), "does not exist") {
			t.Errorf("expected does-not-exist error, got: %v", err)
		}
	})
}

// --- ClusterExistsAndActive ---

func TestClusterExistsAndActive(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("active cluster passes", func(t *testing.T) {
		if err := ClusterExistsAndActive(db, "cl_valtest00001"); err != nil {
			t.Errorf("unexpected error: %v", err)
		}
	})

	t.Run("inactive cluster fails", func(t *testing.T) {
		err := ClusterExistsAndActive(db, "cl_valtest00002")
		if err == nil || !strings.Contains(err.Error(), "not active") {
			t.Errorf("expected not-active error, got: %v", err)
		}
	})

	t.Run("nonexistent cluster fails", func(t *testing.T) {
		err := ClusterExistsAndActive(db, "cl_nonexist00")
		if err == nil || !strings.Contains(err.Error(), "not found") {
			t.Errorf("expected not-found error, got: %v", err)
		}
	})
}

// --- PatternExistsAndActive ---

func TestPatternExistsAndActive(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("active pattern passes", func(t *testing.T) {
		if err := PatternExistsAndActive(db, "pat_valtest0001"); err != nil {
			t.Errorf("unexpected error: %v", err)
		}
	})

	t.Run("inactive pattern fails", func(t *testing.T) {
		err := PatternExistsAndActive(db, "pat_valtest0002")
		if err == nil || !strings.Contains(err.Error(), "not active") {
			t.Errorf("expected not-active error, got: %v", err)
		}
	})

	t.Run("nonexistent pattern fails", func(t *testing.T) {
		err := PatternExistsAndActive(db, "pat_nonexist0")
		if err == nil || !strings.Contains(err.Error(), "does not exist") {
			t.Errorf("expected does-not-exist error, got: %v", err)
		}
	})
}

// --- LocationExistsAndActive ---

func TestLocationExistsAndActive(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("active location passes", func(t *testing.T) {
		if err := LocationExistsAndActive(db, "loc_valtest0001"); err != nil {
			t.Errorf("unexpected error: %v", err)
		}
	})

	t.Run("inactive location fails", func(t *testing.T) {
		err := LocationExistsAndActive(db, "loc_valtest0003")
		if err == nil || !strings.Contains(err.Error(), "not active") {
			t.Errorf("expected not-active error, got: %v", err)
		}
	})

	t.Run("nonexistent location fails", func(t *testing.T) {
		err := LocationExistsAndActive(db, "loc_nonexist00")
		if err == nil || !strings.Contains(err.Error(), "not found") {
			t.Errorf("expected not-found error, got: %v", err)
		}
	})
}

// --- ValidateDatasetTypeForExport ---

func TestValidateDatasetTypeForExport(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("structured active dataset passes", func(t *testing.T) {
		name, err := ValidateDatasetTypeForExport(db, "ds_valtest00001")
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if name != "Val Structured" {
			t.Errorf("got %q, want Val Structured", name)
		}
	})

	t.Run("unstructured dataset fails type check", func(t *testing.T) {
		_, err := ValidateDatasetTypeForExport(db, "ds_valtest00002")
		if err == nil || !strings.Contains(err.Error(), "only structured") {
			t.Errorf("expected structured-only error, got: %v", err)
		}
	})

	t.Run("inactive dataset fails", func(t *testing.T) {
		_, err := ValidateDatasetTypeForExport(db, "ds_valtest00003")
		if err == nil || !strings.Contains(err.Error(), "not active") {
			t.Errorf("expected not-active error, got: %v", err)
		}
	})

	t.Run("nonexistent dataset fails", func(t *testing.T) {
		_, err := ValidateDatasetTypeForExport(db, "ds_nonexist00")
		if err == nil || !strings.Contains(err.Error(), "does not exist") {
			t.Errorf("expected does-not-exist error, got: %v", err)
		}
	})
}

// --- ClusterBelongsToLocation ---

func TestClusterBelongsToLocation(t *testing.T) {
	db := setupValidationDB(t)
	defer db.Close()

	t.Run("cluster in correct location passes", func(t *testing.T) {
		if err := ClusterBelongsToLocation(db, "cl_valtest00001", "loc_valtest0001"); err != nil {
			t.Errorf("unexpected error: %v", err)
		}
	})

	t.Run("cluster in wrong location fails", func(t *testing.T) {
		err := ClusterBelongsToLocation(db, "cl_valtest00001", "loc_valtest0002")
		if err == nil || !strings.Contains(err.Error(), "does not belong") {
			t.Errorf("expected does-not-belong error, got: %v", err)
		}
	})

	t.Run("inactive cluster fails", func(t *testing.T) {
		err := ClusterBelongsToLocation(db, "cl_valtest00002", "loc_valtest0001")
		if err == nil || !strings.Contains(err.Error(), "not active") {
			t.Errorf("expected not-active error, got: %v", err)
		}
	})

	t.Run("nonexistent cluster fails", func(t *testing.T) {
		err := ClusterBelongsToLocation(db, "cl_nonexist00", "loc_valtest0001")
		if err == nil || !strings.Contains(err.Error(), "does not exist") {
			t.Errorf("expected does-not-exist error, got: %v", err)
		}
	})
}