// Copyright 2022 Tailscale Inc & Contributors // SPDX-License-Identifier: BSD-3-Clause package golink import ( "path" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" ) // Test saving, loading, and deleting links for SQLiteDB. func Test_SQLiteDB_SaveLoadDeleteLinks(t *testing.T) { db, err := NewSQLiteDB(path.Join(t.TempDir(), "links.db")) if err != nil { t.Error(err) } 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) } for _, link := range links { if err := db.Delete(link.Short); err != nil { t.Error(err) } } got, err = db.LoadAll() if err != nil { t.Error(err) } want := []*Link(nil) if !cmp.Equal(got, want) { t.Errorf("db.LoadAll got %v, want %v", got, want) } } // Test saving, loading, and deleting stats for SQLiteDB. func Test_SQLiteDB_SaveLoadDeleteStats(t *testing.T) { db, err := NewSQLiteDB(path.Join(t.TempDir(), "links.db")) if err != nil { t.Error(err) } // preload some links links := []*Link{ {Short: "a"}, {Short: "B-c"}, } for _, link := range links { if err := db.Save(link); err != nil { t.Error(err) } } // Stats to record and then retrieve. // Stats to store do not need to be their canonical short name, // but returned stats always should be. stats := []ClickStats{ {"a": 1}, {"b-c": 1}, {"a": 1, "bc": 2}, } want := ClickStats{ "a": 2, "B-c": 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) } for k := range want { if err := db.DeleteStats(k); err != nil { t.Error(err) } } got, err = db.LoadStats() if err != nil { t.Error(err) } want = ClickStats{} if !cmp.Equal(got, want) { t.Errorf("db.LoadStats got %v, want %v", got, want) } }