105 lines
2.8 KiB
Go
105 lines
2.8 KiB
Go
package main
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/google/uuid"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestIDMapRoundTripFixture(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
dir := t.TempDir()
|
||
|
|
users := map[string]string{
|
||
|
|
"user_2abcClerkId": "550e8400-e29b-41d4-a716-446655440000",
|
||
|
|
}
|
||
|
|
companies := map[string]string{
|
||
|
|
"org_or_legacy_company_text_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
|
||
|
|
}
|
||
|
|
path, err := WriteIDMapDir(dir, users, companies, true)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("WriteIDMapDir: %v", err)
|
||
|
|
}
|
||
|
|
if filepath.Base(path) != "id-map.json" {
|
||
|
|
t.Fatalf("unexpected path %s", path)
|
||
|
|
}
|
||
|
|
|
||
|
|
doc, err := ReadIDMap(path)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("ReadIDMap: %v", err)
|
||
|
|
}
|
||
|
|
if doc.Version != 1 || !doc.Meta.DryRun {
|
||
|
|
t.Fatalf("meta %#v", doc.Meta)
|
||
|
|
}
|
||
|
|
if doc.Meta.UserCount != 1 || doc.Meta.CompanyCount != 1 {
|
||
|
|
t.Fatalf("counts user=%d company=%d", doc.Meta.UserCount, doc.Meta.CompanyCount)
|
||
|
|
}
|
||
|
|
|
||
|
|
uid, ok := doc.ResolveUser("user_2abcClerkId")
|
||
|
|
if !ok || uid.String() != "550e8400-e29b-41d4-a716-446655440000" {
|
||
|
|
t.Fatalf("ResolveUser = %v ok=%v", uid, ok)
|
||
|
|
}
|
||
|
|
cid, ok := doc.ResolveCompany("org_or_legacy_company_text_id")
|
||
|
|
if !ok || cid.String() != "6ba7b810-9dad-11d1-80b4-00c04fd430c8" {
|
||
|
|
t.Fatalf("ResolveCompany = %v ok=%v", cid, ok)
|
||
|
|
}
|
||
|
|
if _, ok := doc.ResolveUser("missing"); ok {
|
||
|
|
t.Fatal("expected missing user")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestIDMapValidateRejectsBadUUID(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
doc := NewIDMapDocument(map[string]string{"u1": "not-a-uuid"}, nil, false)
|
||
|
|
if err := doc.Validate(); err == nil {
|
||
|
|
t.Fatal("expected validation error")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestIDMapValidateRejectsEmptyLegacy(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
doc := NewIDMapDocument(map[string]string{"": uuid.New().String()}, nil, false)
|
||
|
|
if err := doc.Validate(); err == nil {
|
||
|
|
t.Fatal("expected empty legacy error")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestIDMapWriteRejectsInvalid(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
path := filepath.Join(t.TempDir(), "bad.json")
|
||
|
|
err := WriteIDMap(path, IDMapDocument{Version: 2})
|
||
|
|
if err == nil {
|
||
|
|
t.Fatal("expected write validation error")
|
||
|
|
}
|
||
|
|
if _, err := os.Stat(path); !os.IsNotExist(err) {
|
||
|
|
t.Fatalf("file should not exist, stat err=%v", err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestRemapOrphanDetectionFixture(t *testing.T) {
|
||
|
|
t.Parallel()
|
||
|
|
// Membership rows whose company/user legacy IDs are absent from the map are orphans.
|
||
|
|
companies := map[string]string{"co_a": uuid.New().String()}
|
||
|
|
users := map[string]string{"user_a": uuid.New().String()}
|
||
|
|
doc := NewIDMapDocument(users, companies, false)
|
||
|
|
|
||
|
|
type membership struct{ CompanyLegacy, UserLegacy string }
|
||
|
|
rows := []membership{
|
||
|
|
{"co_a", "user_a"},
|
||
|
|
{"co_missing", "user_a"},
|
||
|
|
{"co_a", "user_missing"},
|
||
|
|
}
|
||
|
|
orphans := 0
|
||
|
|
for _, m := range rows {
|
||
|
|
_, okC := doc.ResolveCompany(m.CompanyLegacy)
|
||
|
|
_, okU := doc.ResolveUser(m.UserLegacy)
|
||
|
|
if !okC || !okU {
|
||
|
|
orphans++
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if orphans != 2 {
|
||
|
|
t.Fatalf("orphans = %d, want 2", orphans)
|
||
|
|
}
|
||
|
|
}
|