From 81bfa438b121882d9ca724b676baf1adfc33f0fe Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Sun, 28 Nov 2021 09:02:09 +0100 Subject: [PATCH] Test queue --- go.mod | 4 ++-- go.sum | 4 ++-- queue.go | 21 +++++++++++++---- queue_test.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 queue_test.go diff --git a/go.mod b/go.mod index 47784dd..2b077de 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,8 @@ require ( github.com/yuin/goldmark-emoji v1.0.2-0.20210607094911-0487583eca38 github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 - golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4 + golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/text v0.3.7 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b @@ -118,7 +119,6 @@ require ( go4.org/intern v0.0.0-20211027215823-ae77deb06f29 // indirect go4.org/mem v0.0.0-20201119185036-c04c5a6ff174 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 // indirect - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect golang.org/x/sys v0.0.0-20211110154304-99a53858aa08 // indirect golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 // indirect golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect diff --git a/go.sum b/go.sum index 976c1a0..91df073 100644 --- a/go.sum +++ b/go.sum @@ -635,8 +635,8 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4 h1:DZshvxDdVoeKIbudAdFEKi+f70l51luSy/7b76ibTY0= -golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 h1:0qxwC5n+ttVOINCBeRHO0nq9X7uy8SDsPoi5OaCdIEI= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/queue.go b/queue.go index 8b61281..afd2e18 100644 --- a/queue.go +++ b/queue.go @@ -19,13 +19,22 @@ func (db *database) enqueue(name string, content []byte, schedule time.Time) err if len(content) == 0 { return errors.New("empty content") } - _, err := db.exec("insert into queue (name, content, schedule) values (@name, @content, @schedule)", - sql.Named("name", name), sql.Named("content", content), sql.Named("schedule", schedule.UTC().Format(time.RFC3339))) + _, err := db.exec( + "insert into queue (name, content, schedule) values (@name, @content, @schedule)", + sql.Named("name", name), + sql.Named("content", content), + sql.Named("schedule", schedule.UTC().Format(time.RFC3339Nano)), + ) return err } func (db *database) reschedule(qi *queueItem, dur time.Duration) error { - _, err := db.exec("update queue set schedule = @schedule, content = @content where id = @id", sql.Named("schedule", qi.schedule.Add(dur).UTC().Format(time.RFC3339)), sql.Named("content", qi.content), sql.Named("id", qi.id)) + _, err := db.exec( + "update queue set schedule = @schedule, content = @content where id = @id", + sql.Named("schedule", qi.schedule.Add(dur).UTC().Format(time.RFC3339Nano)), + sql.Named("content", qi.content), + sql.Named("id", qi.id), + ) return err } @@ -35,7 +44,11 @@ func (db *database) dequeue(qi *queueItem) error { } func (db *database) peekQueue(name string) (*queueItem, error) { - row, err := db.queryRow("select id, name, content, schedule from queue where schedule <= @schedule and name = @name order by schedule asc limit 1", sql.Named("name", name), sql.Named("schedule", time.Now().UTC().Format(time.RFC3339))) + row, err := db.queryRow( + "select id, name, content, schedule from queue where schedule <= @schedule and name = @name order by schedule asc limit 1", + sql.Named("name", name), + sql.Named("schedule", time.Now().UTC().Format(time.RFC3339Nano)), + ) if err != nil { return nil, err } diff --git a/queue_test.go b/queue_test.go new file mode 100644 index 0000000..1f5cb00 --- /dev/null +++ b/queue_test.go @@ -0,0 +1,63 @@ +package main + +import ( + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func Test_queue(t *testing.T) { + + app := &goBlog{ + cfg: &config{ + Db: &configDb{ + File: filepath.Join(t.TempDir(), "test.db"), + }, + }, + } + _ = app.initDatabase(false) + db := app.db + + err := db.enqueue("test", []byte(""), time.Now()) + require.Error(t, err) + + err = db.enqueue("test", []byte("1"), time.Now()) + require.NoError(t, err) + + err = db.enqueue("test", []byte("2"), time.Now()) + require.NoError(t, err) + + qi, err := db.peekQueue("abc") + require.NoError(t, err) + require.Nil(t, qi) + + qi, err = db.peekQueue("test") + require.NoError(t, err) + require.NotNil(t, qi) + require.Equal(t, []byte("1"), qi.content) + + err = db.reschedule(qi, 1*time.Second) + require.NoError(t, err) + + qi, err = db.peekQueue("test") + require.NoError(t, err) + require.NotNil(t, qi) + require.Equal(t, []byte("2"), qi.content) + + err = db.dequeue(qi) + require.NoError(t, err) + + qi, err = db.peekQueue("test") + require.NoError(t, err) + require.Nil(t, qi) + + time.Sleep(1 * time.Second) + + qi, err = db.peekQueue("test") + require.NoError(t, err) + require.NotNil(t, qi) + require.Equal(t, []byte("1"), qi.content) + +}