ZDDC/zddc/internal/apps/availability_test.go
2026-06-11 13:32:31 -05:00

116 lines
4.1 KiB
Go

package apps
import (
"path/filepath"
"testing"
)
func TestAppAvailableAt(t *testing.T) {
root := "/srv/zddc"
cases := []struct {
dir, app string
want bool
}{
// archive: everywhere (baseline)
{root, "archive", true},
{root + "/Project-A", "archive", true},
{root + "/Project-A/working/ACME", "archive", true},
{root + "/Project-A/some-other-folder", "archive", true},
// landing: only at root
{root, "landing", true},
{root + "/Project-A", "landing", false},
// classifier: the inbound/draft workspace peers (incoming/working/staging)
{root, "classifier", false},
{root + "/Project-A", "classifier", false},
{root + "/Project-A/working/ACME", "classifier", true},
{root + "/Project-A/working/ACME/deep/nested/path", "classifier", true},
{root + "/Project-A/staging/ACME", "classifier", true},
{root + "/Project-A/staging/ACME/2026-06-15_x (DFT) - y", "classifier", true},
{root + "/Project-A/incoming/ACME", "classifier", true},
{root + "/Project-A/incoming/ACME/sub", "classifier", true},
{root + "/Project-A/reviewing/ACME", "classifier", false},
{root + "/Project-A/archive/ACME/received", "classifier", false},
{root + "/Project-A/mdl/ACME", "classifier", false},
{root + "/Project-A/some-other-folder", "classifier", false},
// browse: universal (baseline)
{root + "/Project-A/working/ACME", "browse", true},
{root + "/Project-A/staging/ACME", "browse", true},
{root + "/Project-A/incoming/ACME", "browse", true},
// transmittal: the staging peer only
{root + "/Project-A/staging/ACME", "transmittal", true},
{root + "/Project-A/staging/ACME/sub", "transmittal", true},
{root + "/Project-A/working/ACME", "transmittal", false},
{root + "/Project-A/archive/ACME/issued", "transmittal", false},
// tables: the register peers
{root + "/Project-A/mdl/ACME", "tables", true},
{root + "/Project-A/rsk/ACME", "tables", true},
{root + "/Project-A/ssr", "tables", true},
// case-fold: any case of a peer name matches
{root + "/Project-A/Staging/ACME", "transmittal", true},
{root + "/Project-A/STAGING/ACME", "transmittal", true},
{root + "/Project-A/Incoming/ACME", "classifier", true},
// unknown app
{root + "/Project-A", "weird", false},
}
for _, tc := range cases {
t.Run(tc.app+"@"+tc.dir, func(t *testing.T) {
got := AppAvailableAt(root, filepath.Clean(tc.dir), tc.app)
if got != tc.want {
t.Errorf("AppAvailableAt(%q, %q) = %v, want %v", tc.dir, tc.app, got, tc.want)
}
})
}
}
func TestDefaultAppAt(t *testing.T) {
root := "/srv/zddc"
cases := []struct {
dir string
want string
}{
// Deployment root + bare project root: no default tool.
{root, ""},
{root + "/Project-A", ""},
// Top-level peers.
{root + "/Project-A/working", "browse"},
{root + "/Project-A/staging", "transmittal"},
{root + "/Project-A/reviewing", "browse"},
{root + "/Project-A/incoming", "classifier"},
{root + "/Project-A/ssr", "tables"},
{root + "/Project-A/mdl", "tables"},
{root + "/Project-A/rsk", "tables"},
// Per-party subdirs inherit the peer default.
{root + "/Project-A/working/Acme", "browse"},
{root + "/Project-A/working/Acme/2026-06-15_x (DFT) - y", "browse"},
{root + "/Project-A/staging/Acme", "transmittal"},
{root + "/Project-A/incoming/Acme", "classifier"},
{root + "/Project-A/mdl/Acme", "tables"},
{root + "/Project-A/mdl/Acme/anything-deeper", "tables"},
{root + "/Project-A/rsk/Acme", "tables"},
// The committed record: archive subtree → archive tool.
{root + "/Project-A/archive", "archive"},
{root + "/Project-A/archive/Acme", "archive"},
{root + "/Project-A/archive/Acme/received", "archive"},
{root + "/Project-A/archive/Acme/issued", "archive"},
// Random non-canonical folder names → no default.
{root + "/Project-A/scratch", ""},
// Case-fold on peer names.
{root + "/Project-A/Working/Acme", "browse"},
{root + "/Project-A/STAGING/Acme", "transmittal"},
{root + "/Project-A/MDL/Acme", "tables"},
}
for _, tc := range cases {
t.Run(tc.dir, func(t *testing.T) {
if got := DefaultAppAt(root, tc.dir); got != tc.want {
t.Errorf("DefaultAppAt(%q) = %q, want %q", tc.dir, got, tc.want)
}
})
}
}