cmd/golink: add tests for DB implementations

Change-Id: I520aa5053199ff0be56669832aff2603a56f9e6c
This commit is contained in:
Will Norris
2022-06-14 16:02:26 -07:00
parent 4dff66c71c
commit 619ecd14bf
2 changed files with 141 additions and 2 deletions
+1 -2
View File
@@ -92,7 +92,6 @@ func NewFileDB(dir string, mkdir bool) (*FileDB, error) {
// characters.
func (f *FileDB) linkPath(short string) string {
name := linkID(short)
name = strings.ReplaceAll(name, ".", "%2e")
return filepath.Join(f.dir, name)
}
@@ -144,7 +143,7 @@ func (f *FileDB) Save(link *Link) error {
}
func (f *FileDB) LoadStats() (ClickStats, error) {
links, err := db.LoadAll()
links, err := f.LoadAll()
if err != nil {
return nil, err
}
+140
View File
@@ -0,0 +1,140 @@
package main
import (
"path"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
)
func Test_FileDB_linkPath(t *testing.T) {
tests := []struct {
short, want string
}{
{"foo", "foo"},
{"FOO", "foo"},
{"foo-bar", "foobar"},
{"foo.bar", "foo.bar"},
{"foo/bar", "foo%2Fbar"},
}
db := &FileDB{dir: "/tmp"}
for _, tt := range tests {
want := "/tmp/" + tt.want
if got := db.linkPath(tt.short); got != want {
t.Errorf("linkPath(%q) got %q, want %q", tt.short, got, want)
}
}
}
// Test saving and loading links for FileDB
func Test_FileDB_SaveLoadLinks(t *testing.T) {
db, err := NewFileDB(t.TempDir(), false)
if err != nil {
t.Error(err)
}
testSaveAndLoadLinks(t, db)
}
// Test saving and loading stats for FileDB
func Test_FileDB_SaveLoadStats(t *testing.T) {
db, err := NewFileDB(t.TempDir(), false)
if err != nil {
t.Error(err)
}
testSaveAndLoadStats(t, db)
}
// Test saving and loading links for SQLiteDB
func Test_SQLiteDB_SaveLoadLinks(t *testing.T) {
db, err := NewSQLiteDB(path.Join(t.TempDir(), "links.db"))
if err != nil {
t.Error(err)
}
testSaveAndLoadLinks(t, db)
}
// Test saving and loading stats for SQLiteDB
func Test_SQLiteDB_SaveLoadStats(t *testing.T) {
db, err := NewSQLiteDB(path.Join(t.TempDir(), "links.db"))
if err != nil {
t.Error(err)
}
testSaveAndLoadStats(t, db)
}
func testSaveAndLoadLinks(t *testing.T, db DB) {
links := []*Link{
{Short: "short", Long: "long"},
{Short: "Foo.Bar", Long: "long"},
}
for _, link := range links {
if err := db.Save(link); err != nil {
t.Error(err)
}
got, err := db.Load(link.Short)
if err != nil {
t.Error(err)
}
if !cmp.Equal(got, link) {
t.Errorf("db save and load got %v, want %v", *got, *link)
}
}
got, err := db.LoadAll()
if err != nil {
t.Error(err)
}
sortLinks := cmpopts.SortSlices(func(a, b *Link) bool {
return a.Short < b.Short
})
if !cmp.Equal(got, links, sortLinks) {
t.Errorf("db.LoadAll got %v, want %v", got, links)
}
}
func testSaveAndLoadStats(t *testing.T, db DB) {
// preload some links
links := []*Link{
{Short: "a"},
{Short: "b"},
}
for _, link := range links {
if err := db.Save(link); err != nil {
t.Error(err)
}
}
// stats to record and then retrieve
stats := []ClickStats{
{"a": 1},
{"b": 1},
{"a": 1, "b": 2},
}
want := ClickStats{
"a": 2,
"b": 3,
}
for _, s := range stats {
if err := db.SaveStats(s); err != nil {
t.Error(err)
}
}
got, err := db.LoadStats()
if err != nil {
t.Error(err)
}
if !cmp.Equal(got, want) {
t.Errorf("db.LoadStats got %v, want %v", got, want)
}
}