Go · 1165 bytes Raw Blame History
1 // SPDX-License-Identifier: AGPL-3.0-or-later
2
3 package migrationsfs
4
5 import (
6 "fmt"
7 "io/fs"
8 "sort"
9 "strings"
10 "testing"
11 )
12
13 func TestMigrationVersionsAreUnique(t *testing.T) {
14 t.Parallel()
15
16 entries, err := fs.ReadDir(FS(), ".")
17 if err != nil {
18 t.Fatalf("ReadDir migrations: %v", err)
19 }
20
21 byVersion := make(map[string][]string)
22 for _, entry := range entries {
23 if entry.IsDir() || !isGooseMigrationName(entry.Name()) {
24 continue
25 }
26 version := entry.Name()[:4]
27 byVersion[version] = append(byVersion[version], entry.Name())
28 }
29
30 duplicates := make([]string, 0)
31 for version, names := range byVersion {
32 if len(names) <= 1 {
33 continue
34 }
35 sort.Strings(names)
36 duplicates = append(duplicates, fmt.Sprintf("%s: %s", version, strings.Join(names, ", ")))
37 }
38 sort.Strings(duplicates)
39 if len(duplicates) > 0 {
40 t.Fatalf("duplicate goose migration versions:\n%s", strings.Join(duplicates, "\n"))
41 }
42 }
43
44 func isGooseMigrationName(name string) bool {
45 if len(name) < len("0000_.sql") || !strings.HasSuffix(name, ".sql") || name[4] != '_' {
46 return false
47 }
48 for _, r := range name[:4] {
49 if r < '0' || r > '9' {
50 return false
51 }
52 }
53 return true
54 }
55