mirror of
https://github.com/MeshTender/MeshTender.git
synced 2026-09-01 17:38:15 +00:00
153 lines
4.3 KiB
Go
153 lines
4.3 KiB
Go
package store
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestRepeaterPublicID(t *testing.T) {
|
|
t.Parallel()
|
|
st, ctx := orgTestStore(t)
|
|
owner, err := st.CreateUser(ctx, "pidowner", "")
|
|
if err != nil {
|
|
t.Fatalf("create user: %v", err)
|
|
}
|
|
|
|
mk := func(key string) *Repeater {
|
|
rep, err := st.CreateRepeater(ctx, &Repeater{
|
|
OwnerID: owner.ID, Name: "R", PublicKeyHex: key,
|
|
RadioFreqHz: 1, RadioBwHz: 1, RadioSF: 11, RadioCR: 5,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("create repeater: %v", err)
|
|
}
|
|
return rep
|
|
}
|
|
a := mk(strings.Repeat("a", 64))
|
|
b := mk(strings.Repeat("b", 64))
|
|
|
|
if a.PublicID == "" || b.PublicID == "" {
|
|
t.Fatalf("public ids must be populated: %q %q", a.PublicID, b.PublicID)
|
|
}
|
|
if a.PublicID == b.PublicID {
|
|
t.Fatalf("public ids must be distinct: %q", a.PublicID)
|
|
}
|
|
got, err := st.RepeaterIDByPublicID(ctx, a.PublicID)
|
|
if err != nil || got != a.ID {
|
|
t.Fatalf("resolve %q = (%d, %v), want %d", a.PublicID, got, err, a.ID)
|
|
}
|
|
if _, err := st.RepeaterIDByPublicID(ctx, "does-not-exist"); !errors.Is(err, ErrNotFound) {
|
|
t.Fatalf("unknown public id = %v, want ErrNotFound", err)
|
|
}
|
|
}
|
|
|
|
func TestOrgSlugGeneration(t *testing.T) {
|
|
t.Parallel()
|
|
st, ctx := orgTestStore(t)
|
|
creator, err := st.CreateUser(ctx, "slugcreator", "")
|
|
if err != nil {
|
|
t.Fatalf("create user: %v", err)
|
|
}
|
|
|
|
o1, err := st.CreateOrg(ctx, "Buffalo Mesh!", creator.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if o1.Slug != "buffalo-mesh" {
|
|
t.Fatalf("slug = %q, want buffalo-mesh", o1.Slug)
|
|
}
|
|
o2, err := st.CreateOrg(ctx, "Buffalo Mesh", creator.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if o2.Slug != "buffalo-mesh-2" {
|
|
t.Fatalf("collision slug = %q, want buffalo-mesh-2", o2.Slug)
|
|
}
|
|
|
|
got, err := st.OrgIDBySlug(ctx, "buffalo-mesh")
|
|
if err != nil || got != o1.ID {
|
|
t.Fatalf("resolve slug = (%d, %v), want %d", got, err, o1.ID)
|
|
}
|
|
if _, err := st.OrgIDBySlug(ctx, "nope"); !errors.Is(err, ErrNotFound) {
|
|
t.Fatalf("unknown slug = %v, want ErrNotFound", err)
|
|
}
|
|
|
|
// Renaming o2's slug to o1's is rejected as a duplicate.
|
|
if err := st.UpdateOrg(ctx, o2.ID, "buffalo-mesh", "X", "", ""); !errors.Is(err, ErrDuplicate) {
|
|
t.Fatalf("update to taken slug = %v, want ErrDuplicate", err)
|
|
}
|
|
// A free slug is accepted.
|
|
if err := st.UpdateOrg(ctx, o2.ID, "buffalo-backup", "X", "", ""); err != nil {
|
|
t.Fatalf("update to free slug: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestValidOrgSlug(t *testing.T) {
|
|
t.Parallel()
|
|
cases := map[string]bool{
|
|
"buffalo-mesh": true,
|
|
"abc": true,
|
|
"a1-b2-c3": true,
|
|
"new": false, // reserved (collides with /orgs/new)
|
|
"ab": false, // too short
|
|
"-leading": false,
|
|
"trailing-": false,
|
|
"double--hyph": false,
|
|
"UpperCase": false,
|
|
"has space": false,
|
|
"": false,
|
|
}
|
|
for s, want := range cases {
|
|
if got := ValidOrgSlug(s); got != want {
|
|
t.Errorf("ValidOrgSlug(%q) = %v, want %v", s, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestOrgDomains(t *testing.T) {
|
|
t.Parallel()
|
|
st, ctx := orgTestStore(t)
|
|
creator, err := st.CreateUser(ctx, "domowner", "")
|
|
if err != nil {
|
|
t.Fatalf("create user: %v", err)
|
|
}
|
|
org, err := st.CreateOrg(ctx, "Domain Org", creator.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
d, err := st.CreateOrgDomain(ctx, org.ID, "mesh.example.org")
|
|
if err != nil {
|
|
t.Fatalf("create domain: %v", err)
|
|
}
|
|
if d.VerificationToken == "" || d.Verified() {
|
|
t.Fatalf("new domain should be unverified with a token, got %+v", d)
|
|
}
|
|
|
|
// Unverified domains do not resolve.
|
|
if _, ok, err := st.OrgByVerifiedDomain(ctx, "mesh.example.org"); err != nil || ok {
|
|
t.Fatalf("unverified resolve = (ok=%v, err=%v), want ok=false", ok, err)
|
|
}
|
|
|
|
// Claiming the same hostname again is a duplicate.
|
|
if _, err := st.CreateOrgDomain(ctx, org.ID, "mesh.example.org"); !errors.Is(err, ErrDuplicate) {
|
|
t.Fatalf("duplicate hostname = %v, want ErrDuplicate", err)
|
|
}
|
|
|
|
if err := st.MarkOrgDomainVerified(ctx, org.ID, d.ID); err != nil {
|
|
t.Fatalf("verify: %v", err)
|
|
}
|
|
got, ok, err := st.OrgByVerifiedDomain(ctx, "mesh.example.org")
|
|
if err != nil || !ok || got.ID != org.ID {
|
|
t.Fatalf("verified resolve = (%v, ok=%v, err=%v), want org %d", got, ok, err, org.ID)
|
|
}
|
|
|
|
if err := st.DeleteOrgDomain(ctx, org.ID, d.ID); err != nil {
|
|
t.Fatalf("delete: %v", err)
|
|
}
|
|
if _, ok, _ := st.OrgByVerifiedDomain(ctx, "mesh.example.org"); ok {
|
|
t.Fatalf("deleted domain still resolves")
|
|
}
|
|
}
|