MyTinyTodo2/mytinytodo/buffer_test.go

144 lines
3.5 KiB
Go

package mytinytodo
import (
"local/mytinytodoclient/mytinytodo/remote"
"net/http"
"net/http/httptest"
"os"
"testing"
"time"
)
func TestNewBuffer(t *testing.T) {
b, s := mockBuffer(t)
defer b.Close()
defer s.Close()
}
func TestBufferEnqueue(t *testing.T) {
b, s := mockBuffer(t)
defer b.Close()
defer s.Close()
if err := b.Enqueue(remote.NEW, remote.List{ID: "list"}, remote.Task{Title: "task"}, "one", "tag", "two"); err != nil {
t.Errorf("cannot enqueue: %v", err)
}
todo1 := NewStringArray()
if err := b.db.Get(nsQueue, keyQueue, todo1); err != nil || len(todo1.StringArray()) != 1 {
t.Fatalf("enqueue didnt create list: %v (%d)", err, len(todo1.StringArray()))
}
}
func TestBufferDequeue(t *testing.T) {
b, s := mockBuffer(t)
defer b.Close()
defer s.Close()
if err := b.Enqueue(remote.NEW, remote.List{ID: "list"}, remote.Task{Title: "task"}, "one", "tag", "two"); err != nil {
t.Fatalf("cannot enqueue to dequeue: %v", err)
}
todo1 := NewStringArray()
if err := b.db.Get(nsQueue, keyQueue, todo1); err != nil || len(todo1.StringArray()) != 1 {
t.Fatalf("enqueue didnt create list: %v (%d)", err, len(todo1.StringArray()))
}
b.Dequeue()
todo2 := NewStringArray()
if err := b.db.Get(nsQueue, keyQueue, todo2); err != nil || len(todo2.StringArray()) != 0 {
t.Fatalf("dequeue didnt remove from list: %v (%d)", err, len(todo2.StringArray()))
}
}
func TestBufferRefreshLocal(t *testing.T) {
b, s := mockBuffer(t)
defer b.Close()
defer s.Close()
b.RefreshLocal()
var lists remote.Lists
if err := b.db.Get(nsLists, keyLists, &lists); err != nil || lists.Length() != 1 {
t.Fatalf("refreshLocal didnt create list: %v (%d)", err, lists.Length())
}
var tasks remote.Tasks
if err := b.db.Get(nsTasks, lists.ListArray()[0].ID, &tasks); err != nil || tasks.Length() != 1 {
t.Fatalf("failed to parse task on refresh: %v (%d)", err, tasks.Length())
}
}
func TestBufferNotDoneCallback(t *testing.T) {
b := &Buffer{
done: make(chan struct{}),
interval: time.Millisecond * 70,
}
called := make(chan struct{})
go b.notDoneCallback(func() {
called <- struct{}{}
})
<-called
close(b.done)
}
func TestBufferLists(t *testing.T) {
b, s := mockBuffer(t)
defer b.Close()
defer s.Close()
b.RefreshLocal()
if lists, err := b.Lists(); err != nil || lists.Length() != 1 {
t.Fatalf("err: buffer cannot lists(): %v (%d)", err, lists.Length())
}
}
func TestBufferTasks(t *testing.T) {
b, s := mockBuffer(t)
defer b.Close()
defer s.Close()
b.RefreshLocal()
if lists, err := b.Lists(); err != nil || lists.Length() != 1 {
t.Fatalf("err: buffer cannot lists(): %v (%d)", err, lists.Length())
} else if tasks, err := b.Tasks(lists.ListArray()[0]); err != nil || tasks.Length() != 1 {
t.Fatalf("err: buffer cannot tasks(): %v (%d)", err, tasks.Length())
}
}
func mockBuffer(t *testing.T) (*Buffer, *httptest.Server) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(`
{
"list":[
{
"id":"id",
"name":"name",
"title":"title",
"compl":0
}
]
}
`))
}))
osArgsWas := os.Args[:]
os.Args = []string{"skip", "-remote", srv.URL, "-p", ""}
defer func() {
os.Args = osArgsWas[:]
}()
config, err := NewConfig()
if err != nil {
t.Fatalf("cannot get new config: %v", err)
}
buff, err := NewBuffer(config)
if err != nil {
t.Fatalf("cannot get new buffer: %v", err)
}
return buff, srv
}