package main import ( "fmt" "io/ioutil" "os" "path" "testing" ) func TestFileAuth(t *testing.T) { user := "username" passw := "password" g := "group" emptyp := func() string { d := t.TempDir() f, err := ioutil.TempFile(d, "login.yaml.*") if err != nil { t.Fatal(err) } f.Close() return path.Join(d, f.Name()) } goodp := func() string { p := emptyp() if err := ensureAndWrite(p, []byte(fmt.Sprintf(`{ "users": { %q: { "password": %q, "groups": [%q] } } }`, user, passw, g))); err != nil { t.Fatal(err) } return p } t.Run("no file", func(t *testing.T) { p := emptyp() os.Remove(p) fa := NewFileAuth(p) if _, err := fa.Login(user, passw); err == nil { t.Fatal(err) } }) t.Run("bad file", func(t *testing.T) { p := emptyp() if err := ensureAndWrite(p, []byte(`{"hello:}`)); err != nil { t.Fatal(err) } fa := NewFileAuth(p) if _, err := fa.Login(user, passw); err == nil { t.Fatal(err) } }) t.Run("bad user", func(t *testing.T) { p := goodp() fa := NewFileAuth(p) if ok, err := fa.Login("bad"+user, passw); err != nil { t.Fatal(err) } else if ok { t.Fatal(ok) } }) t.Run("bad pass", func(t *testing.T) { p := goodp() fa := NewFileAuth(p) if ok, err := fa.Login(user, "bad"+passw); err != nil { t.Fatal(err) } else if ok { t.Fatal(ok) } }) t.Run("good load", func(t *testing.T) { p := goodp() fa := NewFileAuth(p) got, err := fa.load() if err != nil { t.Fatal(err) } if len(got.Users) != 1 { t.Error(got.Users) } if entry, ok := got.Users[user]; !ok { t.Error(ok) } else if entry.Password != passw { t.Error(entry) } else if len(entry.Groups) != 1 { t.Error(entry.Groups) } else if entry.Groups[0] != g { t.Error(entry.Groups) } }) t.Run("good", func(t *testing.T) { p := goodp() b, _ := ioutil.ReadFile(p) t.Logf("goodp: %s: %s", p, b) fa := NewFileAuth(p) if ok, err := fa.Login(user, passw); err != nil { t.Fatal(err) } else if !ok { t.Fatal(ok) } if groups, err := fa.Groups(user); err != nil { t.Fatal(err) } else if len(groups) != 1 { t.Fatal(groups) } else if groups[0] != g { t.Fatal(groups) } }) }