pg passing mvp test with queue

main
Bel LaPointe 2024-04-16 08:53:09 -06:00
parent c7f5cdb040
commit 5557c0920a
2 changed files with 61 additions and 7 deletions

View File

@ -0,0 +1,53 @@
//go:build integration
package main
import (
"context"
"os"
"testing"
"time"
"github.com/breel-render/spoc-bot-vr/model"
)
func TestDriverIntegration(t *testing.T) {
ctx, can := context.WithTimeout(context.Background(), time.Second*30)
defer can()
driver, err := NewDriver(ctx, os.Getenv("DRIVER_CONN"))
if err != nil {
t.Fatal(err)
}
defer driver.Close()
q, err := NewQueue(ctx, t.Name(), driver)
if err != nil {
t.Fatal(err)
}
qV := []byte("hello")
if err := q.Enqueue(ctx, qV); err != nil {
t.Error("q cannot enqueue:", err)
} else if reservation, v, err := q.Syn(ctx); err != nil {
t.Error("q cannot syn:", err)
} else if string(v) != string(qV) {
t.Error("q enqueued wrong:", string(v))
} else if len(reservation) == 0 {
t.Error("q didnt have reservation")
} else if err := q.Ack(ctx, reservation); err != nil {
t.Error("q cannot ack:", err)
}
s, err := NewStorage(ctx, driver)
if err != nil {
t.Fatal(err)
}
evt := model.Event{ID: "x", Name: "y"}
if err := s.UpsertEvent(ctx, evt); err != nil {
t.Error("s cannot upsert:", err)
} else if e, err := s.GetEvent(ctx, evt.ID); err != nil {
t.Error("s cannot get:", err)
} else if e != evt {
t.Error("s upserted wrong:", e)
}
}

View File

@ -20,7 +20,7 @@ func NewNoopQueue() Queue {
func NewQueue(ctx context.Context, topic string, driver Driver) (Queue, error) { func NewQueue(ctx context.Context, topic string, driver Driver) (Queue, error) {
if _, err := driver.ExecContext(ctx, ` if _, err := driver.ExecContext(ctx, `
CREATE TABLE IF NOT EXISTS queue ( CREATE TABLE IF NOT EXISTS queue (
id INTEGER PRIMARY KEY, id TEXT PRIMARY KEY,
topic TEXT NOT NULL, topic TEXT NOT NULL,
updated INTEGER NOT NULL, updated INTEGER NOT NULL,
reservation TEXT, reservation TEXT,
@ -37,11 +37,12 @@ func (q Queue) Enqueue(ctx context.Context, b []byte) error {
return nil return nil
} }
_, err := q.driver.ExecContext(ctx, ` _, err := q.driver.ExecContext(ctx, `
INSERT INTO queue (topic, updated, payload) VALUES (?, ?, ?) INSERT INTO queue (id, topic, updated, payload) VALUES ($4, $1, $2, $3)
`, `,
q.topic, q.topic,
time.Now().Unix(), time.Now().Unix(),
b, b,
uuid.New().String(),
) )
return err return err
} }
@ -71,16 +72,16 @@ func (q Queue) syn(ctx context.Context) ([]byte, []byte, error) {
if result, err := q.driver.ExecContext(ctx, ` if result, err := q.driver.ExecContext(ctx, `
UPDATE queue UPDATE queue
SET SET
updated = ?, reservation = ? updated = $1, reservation = $2
WHERE WHERE
id IN ( id IN (
SELECT id SELECT id
FROM queue FROM queue
WHERE WHERE
topic == ? topic = $3
AND ( AND (
reservation IS NULL reservation IS NULL
OR ? - updated > 60 OR $4 - updated > 60
) )
LIMIT 1 LIMIT 1
) )
@ -95,7 +96,7 @@ func (q Queue) syn(ctx context.Context) ([]byte, []byte, error) {
row := q.driver.QueryRowContext(ctx, ` row := q.driver.QueryRowContext(ctx, `
SELECT payload SELECT payload
FROM queue FROM queue
WHERE reservation==? WHERE reservation=$1
LIMIT 1 LIMIT 1
`, reservation) `, reservation)
if err := row.Err(); err != nil { if err := row.Err(); err != nil {
@ -117,7 +118,7 @@ func (q Queue) ack(ctx context.Context, reservation []byte) error {
} }
result, err := q.driver.ExecContext(ctx, ` result, err := q.driver.ExecContext(ctx, `
DELETE FROM queue DELETE FROM queue
WHERE reservation==? WHERE reservation=$1
`, reservation) `, reservation)
if err != nil { if err != nil {
return err return err