From b1460d214cc54897009c89c44462c91d328974c7 Mon Sep 17 00:00:00 2001 From: Allisson Azevedo Date: Wed, 3 Mar 2021 16:05:58 -0300 Subject: [PATCH] feat: Add context on repository calls (#7) --- repository.go | 30 +++++++------ repository/delivery.go | 31 ++++++------- repository/delivery_attempt.go | 14 +++--- repository/delivery_attempt_test.go | 27 ++++++------ repository/delivery_test.go | 67 +++++++++++++++-------------- repository/webhook.go | 22 +++++----- repository/webhook_test.go | 27 ++++++------ 7 files changed, 117 insertions(+), 101 deletions(-) diff --git a/repository.go b/repository.go index b6e2891..8ca9808 100644 --- a/repository.go +++ b/repository.go @@ -1,5 +1,7 @@ package postmand +import "context" + // RepositoryGetOptions contains options used in the Get methods. type RepositoryGetOptions struct { Filters map[string]interface{} @@ -16,26 +18,26 @@ type RepositoryListOptions struct { // WebhookRepository is the interface that will be used to iterate with the Webhook data. type WebhookRepository interface { - Get(getOptions RepositoryGetOptions) (*Webhook, error) - List(listOptions RepositoryListOptions) ([]*Webhook, error) - Create(webhook *Webhook) error - Update(webhook *Webhook) error - Delete(id ID) error + Get(ctx context.Context, getOptions RepositoryGetOptions) (*Webhook, error) + List(ctx context.Context, listOptions RepositoryListOptions) ([]*Webhook, error) + Create(ctx context.Context, webhook *Webhook) error + Update(ctx context.Context, webhook *Webhook) error + Delete(ctx context.Context, id ID) error } // DeliveryRepository is the interface that will be used to iterate with the Delivery data. type DeliveryRepository interface { - Get(getOptions RepositoryGetOptions) (*Delivery, error) - List(listOptions RepositoryListOptions) ([]*Delivery, error) - Create(delivery *Delivery) error - Update(delivery *Delivery) error - Delete(id ID) error - Dispatch() error + Get(ctx context.Context, getOptions RepositoryGetOptions) (*Delivery, error) + List(ctx context.Context, listOptions RepositoryListOptions) ([]*Delivery, error) + Create(ctx context.Context, delivery *Delivery) error + Update(ctx context.Context, delivery *Delivery) error + Delete(ctx context.Context, id ID) error + Dispatch(ctx context.Context) error } // DeliveryAttemptRepository is the interface that will be used to iterate with the DeliveryAttempt data. type DeliveryAttemptRepository interface { - Get(getOptions RepositoryGetOptions) (*DeliveryAttempt, error) - List(listOptions RepositoryListOptions) ([]*DeliveryAttempt, error) - Create(deliveryAttempt *DeliveryAttempt) error + Get(ctx context.Context, getOptions RepositoryGetOptions) (*DeliveryAttempt, error) + List(ctx context.Context, listOptions RepositoryListOptions) ([]*DeliveryAttempt, error) + Create(ctx context.Context, deliveryAttempt *DeliveryAttempt) error } diff --git a/repository/delivery.go b/repository/delivery.go index 1c449c3..882c358 100644 --- a/repository/delivery.go +++ b/repository/delivery.go @@ -2,6 +2,7 @@ package repository import ( "bytes" + "context" "database/sql" "net/http" "net/http/httputil" @@ -75,46 +76,46 @@ type Delivery struct { } // Get returns postmand.Delivery by options filter. -func (d Delivery) Get(getOptions postmand.RepositoryGetOptions) (*postmand.Delivery, error) { +func (d Delivery) Get(ctx context.Context, getOptions postmand.RepositoryGetOptions) (*postmand.Delivery, error) { delivery := postmand.Delivery{} sql, args := getQuery("deliveries", getOptions) - err := d.db.Get(&delivery, sql, args...) + err := d.db.GetContext(ctx, &delivery, sql, args...) return &delivery, err } // List returns a slice of postmand.Delivery by options filter. -func (d Delivery) List(listOptions postmand.RepositoryListOptions) ([]*postmand.Delivery, error) { +func (d Delivery) List(ctx context.Context, listOptions postmand.RepositoryListOptions) ([]*postmand.Delivery, error) { deliveries := []*postmand.Delivery{} sql, args := listQuery("deliveries", listOptions) - err := d.db.Select(&deliveries, sql, args...) + err := d.db.SelectContext(ctx, &deliveries, sql, args...) return deliveries, err } // Create postmand.Delivery on database. -func (d Delivery) Create(delivery *postmand.Delivery) error { +func (d Delivery) Create(ctx context.Context, delivery *postmand.Delivery) error { sql, args := insertQuery("deliveries", delivery) - _, err := d.db.Exec(sql, args...) + _, err := d.db.ExecContext(ctx, sql, args...) return err } // Update postmand.Delivery on database. -func (d Delivery) Update(delivery *postmand.Delivery) error { +func (d Delivery) Update(ctx context.Context, delivery *postmand.Delivery) error { sql, args := updateQuery("deliveries", delivery.ID, delivery) - _, err := d.db.Exec(sql, args...) + _, err := d.db.ExecContext(ctx, sql, args...) return err } // Delete postmand.Delivery on database. -func (d Delivery) Delete(id postmand.ID) error { +func (d Delivery) Delete(ctx context.Context, id postmand.ID) error { sqlStatement := ` DELETE FROM deliveries WHERE id = $1 ` - _, err := d.db.Exec(sqlStatement, id) + _, err := d.db.ExecContext(ctx, sqlStatement, id) return err } // Dispatch fetchs a delivery and send to url destination. -func (d Delivery) Dispatch() error { +func (d Delivery) Dispatch(ctx context.Context) error { sqlStatement := ` SELECT deliveries.* @@ -139,7 +140,7 @@ func (d Delivery) Dispatch() error { // Get delivery delivery := postmand.Delivery{} - err = tx.Get(&delivery, sqlStatement, postmand.DeliveryStatusPending, time.Now().UTC()) + err = tx.GetContext(ctx, &delivery, sqlStatement, postmand.DeliveryStatusPending, time.Now().UTC()) if err != nil { // Skip if no result if err == sql.ErrNoRows { @@ -154,7 +155,7 @@ func (d Delivery) Dispatch() error { webhook := postmand.Webhook{} getOptions := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.WebhookID}} sql, args := getQuery("webhooks", getOptions) - err = tx.Get(&webhook, sql, args...) + err = tx.GetContext(ctx, &webhook, sql, args...) if err != nil { rollback("get webhook", tx) return err @@ -187,7 +188,7 @@ func (d Delivery) Dispatch() error { delivery.ScheduledAt = newScheduledAt delivery.UpdatedAt = time.Now().UTC() sql, args = updateQuery("deliveries", delivery.ID, delivery) - _, err = tx.Exec(sql, args...) + _, err = tx.ExecContext(ctx, sql, args...) if err != nil { rollback("update delivery", tx) return err @@ -206,7 +207,7 @@ func (d Delivery) Dispatch() error { CreatedAt: time.Now().UTC(), } sql, args = insertQuery("delivery_attempts", deliveryAttempt) - _, err = tx.Exec(sql, args...) + _, err = tx.ExecContext(ctx, sql, args...) if err != nil { rollback("create delivery attempt", tx) return err diff --git a/repository/delivery_attempt.go b/repository/delivery_attempt.go index ef6ed35..c2d0759 100644 --- a/repository/delivery_attempt.go +++ b/repository/delivery_attempt.go @@ -1,6 +1,8 @@ package repository import ( + "context" + "github.com/allisson/postmand" "github.com/jmoiron/sqlx" ) @@ -11,25 +13,25 @@ type DeliveryAttempt struct { } // Get returns postmand.DeliveryAttempt by options filter. -func (d DeliveryAttempt) Get(getOptions postmand.RepositoryGetOptions) (*postmand.DeliveryAttempt, error) { +func (d DeliveryAttempt) Get(ctx context.Context, getOptions postmand.RepositoryGetOptions) (*postmand.DeliveryAttempt, error) { deliveryAttempt := postmand.DeliveryAttempt{} sql, args := getQuery("delivery_attempts", getOptions) - err := d.db.Get(&deliveryAttempt, sql, args...) + err := d.db.GetContext(ctx, &deliveryAttempt, sql, args...) return &deliveryAttempt, err } // List returns a slice of postmand.DeliveryAttempt by options filter. -func (d DeliveryAttempt) List(listOptions postmand.RepositoryListOptions) ([]*postmand.DeliveryAttempt, error) { +func (d DeliveryAttempt) List(ctx context.Context, listOptions postmand.RepositoryListOptions) ([]*postmand.DeliveryAttempt, error) { deliveryAttempts := []*postmand.DeliveryAttempt{} sql, args := listQuery("delivery_attempts", listOptions) - err := d.db.Select(&deliveryAttempts, sql, args...) + err := d.db.SelectContext(ctx, &deliveryAttempts, sql, args...) return deliveryAttempts, err } // Create postmand.DeliveryAttempt on database. -func (d DeliveryAttempt) Create(deliveryAttempt *postmand.DeliveryAttempt) error { +func (d DeliveryAttempt) Create(ctx context.Context, deliveryAttempt *postmand.DeliveryAttempt) error { sql, args := insertQuery("delivery_attempts", deliveryAttempt) - _, err := d.db.Exec(sql, args...) + _, err := d.db.ExecContext(ctx, sql, args...) return err } diff --git a/repository/delivery_attempt_test.go b/repository/delivery_attempt_test.go index 7db7362..7cdd5a7 100644 --- a/repository/delivery_attempt_test.go +++ b/repository/delivery_attempt_test.go @@ -1,6 +1,7 @@ package repository import ( + "context" "testing" "time" @@ -21,23 +22,25 @@ func makeDeliveryAttempt() postmand.DeliveryAttempt { } func TestDeliveryAttempt(t *testing.T) { + ctx := context.Background() + t.Run("Create delivery attempt", func(t *testing.T) { th := newTestHelper() defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) deliveryAttempt := makeDeliveryAttempt() deliveryAttempt.WebhookID = webhook.ID deliveryAttempt.DeliveryID = delivery.ID - err = th.deliveryAttemptRepository.Create(&deliveryAttempt) + err = th.deliveryAttemptRepository.Create(ctx, &deliveryAttempt) assert.Nil(t, err) }) @@ -46,22 +49,22 @@ func TestDeliveryAttempt(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) deliveryAttempt := makeDeliveryAttempt() deliveryAttempt.WebhookID = webhook.ID deliveryAttempt.DeliveryID = delivery.ID - err = th.deliveryAttemptRepository.Create(&deliveryAttempt) + err = th.deliveryAttemptRepository.Create(ctx, &deliveryAttempt) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": deliveryAttempt.ID}} - deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(options) + deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, deliveryAttempt.ID, deliveryAttemptFromRepository.ID) }) @@ -71,28 +74,28 @@ func TestDeliveryAttempt(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) deliveryAttempt1 := makeDeliveryAttempt() deliveryAttempt1.WebhookID = webhook.ID deliveryAttempt1.DeliveryID = delivery.ID - err = th.deliveryAttemptRepository.Create(&deliveryAttempt1) + err = th.deliveryAttemptRepository.Create(ctx, &deliveryAttempt1) assert.Nil(t, err) deliveryAttempt2 := makeDeliveryAttempt() deliveryAttempt2.WebhookID = webhook.ID deliveryAttempt2.DeliveryID = delivery.ID - err = th.deliveryAttemptRepository.Create(&deliveryAttempt2) + err = th.deliveryAttemptRepository.Create(ctx, &deliveryAttempt2) assert.Nil(t, err) options := postmand.RepositoryListOptions{Limit: 1, Offset: 0, OrderBy: "created_at", Order: "DESC"} - deliveryAttempts, err := th.deliveryAttemptRepository.List(options) + deliveryAttempts, err := th.deliveryAttemptRepository.List(ctx, options) assert.Nil(t, err) assert.Len(t, deliveryAttempts, 1) assert.Equal(t, deliveryAttempt2.ID, deliveryAttempts[0].ID) diff --git a/repository/delivery_test.go b/repository/delivery_test.go index 2d2ac0f..5d5eae3 100644 --- a/repository/delivery_test.go +++ b/repository/delivery_test.go @@ -1,6 +1,7 @@ package repository import ( + "context" "database/sql" "net/http" "net/http/httptest" @@ -77,17 +78,19 @@ func TestDispatchToURL(t *testing.T) { } func TestDelivery(t *testing.T) { + ctx := context.Background() + t.Run("Create delivery", func(t *testing.T) { th := newTestHelper() defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) }) @@ -96,20 +99,20 @@ func TestDelivery(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) delivery.Status = postmand.DeliveryStatusPending - err = th.deliveryRepository.Update(&delivery) + err = th.deliveryRepository.Update(ctx, &delivery) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} - deliveryFromRepository, err := th.deliveryRepository.Get(options) + deliveryFromRepository, err := th.deliveryRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, postmand.DeliveryStatusPending, deliveryFromRepository.Status) }) @@ -119,19 +122,19 @@ func TestDelivery(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) - err = th.deliveryRepository.Delete(delivery.ID) + err = th.deliveryRepository.Delete(ctx, delivery.ID) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} - _, err = th.deliveryRepository.Get(options) + _, err = th.deliveryRepository.Get(ctx, options) assert.Equal(t, sql.ErrNoRows, err) }) @@ -140,16 +143,16 @@ func TestDelivery(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} - deliveryFromRepository, err := th.deliveryRepository.Get(options) + deliveryFromRepository, err := th.deliveryRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, delivery.ID, deliveryFromRepository.ID) }) @@ -159,21 +162,21 @@ func TestDelivery(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery1 := makeDelivery() delivery1.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery1) + err = th.deliveryRepository.Create(ctx, &delivery1) assert.Nil(t, err) delivery2 := makeDelivery() delivery2.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery2) + err = th.deliveryRepository.Create(ctx, &delivery2) assert.Nil(t, err) options := postmand.RepositoryListOptions{Limit: 1, Offset: 0, OrderBy: "created_at", Order: "DESC"} - deliveries, err := th.deliveryRepository.List(options) + deliveries, err := th.deliveryRepository.List(ctx, options) assert.Nil(t, err) assert.Len(t, deliveries, 1) assert.Equal(t, delivery2.ID, deliveries[0].ID) @@ -191,25 +194,25 @@ func TestDelivery(t *testing.T) { webhook := makeWebhook() webhook.URL = httpServer.URL - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) - err = th.deliveryRepository.Dispatch() + err = th.deliveryRepository.Dispatch(ctx) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} - deliveryFromRepository, err := th.deliveryRepository.Get(options) + deliveryFromRepository, err := th.deliveryRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, 1, deliveryFromRepository.DeliveryAttempts) assert.Equal(t, postmand.DeliveryStatusSucceeded, deliveryFromRepository.Status) options = postmand.RepositoryGetOptions{Filters: map[string]interface{}{"delivery_id": delivery.ID}} - deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(options) + deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(ctx, options) assert.Nil(t, err) assert.True(t, deliveryAttemptFromRepository.Success) }) @@ -228,26 +231,26 @@ func TestDelivery(t *testing.T) { webhook := makeWebhook() webhook.MaxDeliveryAttempts = 2 webhook.URL = httpServer.URL - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) - err = th.deliveryRepository.Dispatch() + err = th.deliveryRepository.Dispatch(ctx) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} - deliveryFromRepository, err := th.deliveryRepository.Get(options) + deliveryFromRepository, err := th.deliveryRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, 1, deliveryFromRepository.DeliveryAttempts) assert.Equal(t, postmand.DeliveryStatusPending, deliveryFromRepository.Status) assert.True(t, deliveryFromRepository.ScheduledAt.After(delivery.ScheduledAt)) options = postmand.RepositoryGetOptions{Filters: map[string]interface{}{"delivery_id": delivery.ID}} - deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(options) + deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(ctx, options) assert.Nil(t, err) assert.False(t, deliveryAttemptFromRepository.Success) }) @@ -265,25 +268,25 @@ func TestDelivery(t *testing.T) { webhook := makeWebhook() webhook.URL = httpServer.URL - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) delivery := makeDelivery() delivery.WebhookID = webhook.ID - err = th.deliveryRepository.Create(&delivery) + err = th.deliveryRepository.Create(ctx, &delivery) assert.Nil(t, err) - err = th.deliveryRepository.Dispatch() + err = th.deliveryRepository.Dispatch(ctx) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": delivery.ID}} - deliveryFromRepository, err := th.deliveryRepository.Get(options) + deliveryFromRepository, err := th.deliveryRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, 1, deliveryFromRepository.DeliveryAttempts) assert.Equal(t, postmand.DeliveryStatusFailed, deliveryFromRepository.Status) options = postmand.RepositoryGetOptions{Filters: map[string]interface{}{"delivery_id": delivery.ID}} - deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(options) + deliveryAttemptFromRepository, err := th.deliveryAttemptRepository.Get(ctx, options) assert.Nil(t, err) assert.False(t, deliveryAttemptFromRepository.Success) }) diff --git a/repository/webhook.go b/repository/webhook.go index 2c2f564..55ce54a 100644 --- a/repository/webhook.go +++ b/repository/webhook.go @@ -1,6 +1,8 @@ package repository import ( + "context" + "github.com/allisson/postmand" "github.com/jmoiron/sqlx" ) @@ -11,41 +13,41 @@ type Webhook struct { } // Get returns postmand.Webhook by options filter. -func (w Webhook) Get(getOptions postmand.RepositoryGetOptions) (*postmand.Webhook, error) { +func (w Webhook) Get(ctx context.Context, getOptions postmand.RepositoryGetOptions) (*postmand.Webhook, error) { webhook := postmand.Webhook{} sql, args := getQuery("webhooks", getOptions) - err := w.db.Get(&webhook, sql, args...) + err := w.db.GetContext(ctx, &webhook, sql, args...) return &webhook, err } // List returns a slice of postmand.Webhook by options filter. -func (w Webhook) List(listOptions postmand.RepositoryListOptions) ([]*postmand.Webhook, error) { +func (w Webhook) List(ctx context.Context, listOptions postmand.RepositoryListOptions) ([]*postmand.Webhook, error) { webhooks := []*postmand.Webhook{} sql, args := listQuery("webhooks", listOptions) - err := w.db.Select(&webhooks, sql, args...) + err := w.db.SelectContext(ctx, &webhooks, sql, args...) return webhooks, err } // Create postmand.Webhook on database. -func (w Webhook) Create(webhook *postmand.Webhook) error { +func (w Webhook) Create(ctx context.Context, webhook *postmand.Webhook) error { sql, args := insertQuery("webhooks", webhook) - _, err := w.db.Exec(sql, args...) + _, err := w.db.ExecContext(ctx, sql, args...) return err } // Update postmand.Webhook on database. -func (w Webhook) Update(webhook *postmand.Webhook) error { +func (w Webhook) Update(ctx context.Context, webhook *postmand.Webhook) error { sql, args := updateQuery("webhooks", webhook.ID, webhook) - _, err := w.db.Exec(sql, args...) + _, err := w.db.ExecContext(ctx, sql, args...) return err } // Delete postmand.Webhook on database. -func (w Webhook) Delete(id postmand.ID) error { +func (w Webhook) Delete(ctx context.Context, id postmand.ID) error { sqlStatement := ` DELETE FROM webhooks WHERE id = $1 ` - _, err := w.db.Exec(sqlStatement, id) + _, err := w.db.ExecContext(ctx, sqlStatement, id) return err } diff --git a/repository/webhook_test.go b/repository/webhook_test.go index 5329402..908d608 100644 --- a/repository/webhook_test.go +++ b/repository/webhook_test.go @@ -1,6 +1,7 @@ package repository import ( + "context" "database/sql" "testing" "time" @@ -29,12 +30,14 @@ func makeWebhook() postmand.Webhook { } func TestTransaction(t *testing.T) { + ctx := context.Background() + t.Run("Create webhook", func(t *testing.T) { th := newTestHelper() defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) }) @@ -43,15 +46,15 @@ func TestTransaction(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) webhook.ValidStatusCodes = pq.Int32Array{200, 201, 204} - err = th.webhookRepository.Update(&webhook) + err = th.webhookRepository.Update(ctx, &webhook) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": webhook.ID}} - webhookFromRepository, err := th.webhookRepository.Get(options) + webhookFromRepository, err := th.webhookRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, pq.Int32Array{200, 201, 204}, webhookFromRepository.ValidStatusCodes) }) @@ -61,14 +64,14 @@ func TestTransaction(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) - err = th.webhookRepository.Delete(webhook.ID) + err = th.webhookRepository.Delete(ctx, webhook.ID) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": webhook.ID}} - _, err = th.webhookRepository.Get(options) + _, err = th.webhookRepository.Get(ctx, options) assert.Equal(t, sql.ErrNoRows, err) }) @@ -77,11 +80,11 @@ func TestTransaction(t *testing.T) { defer th.db.Close() webhook := makeWebhook() - err := th.webhookRepository.Create(&webhook) + err := th.webhookRepository.Create(ctx, &webhook) assert.Nil(t, err) options := postmand.RepositoryGetOptions{Filters: map[string]interface{}{"id": webhook.ID}} - webhookFromRepository, err := th.webhookRepository.Get(options) + webhookFromRepository, err := th.webhookRepository.Get(ctx, options) assert.Nil(t, err) assert.Equal(t, webhook.ID, webhookFromRepository.ID) }) @@ -91,15 +94,15 @@ func TestTransaction(t *testing.T) { defer th.db.Close() webhook1 := makeWebhook() - err := th.webhookRepository.Create(&webhook1) + err := th.webhookRepository.Create(ctx, &webhook1) assert.Nil(t, err) webhook2 := makeWebhook() - err = th.webhookRepository.Create(&webhook2) + err = th.webhookRepository.Create(ctx, &webhook2) assert.Nil(t, err) options := postmand.RepositoryListOptions{Limit: 1, Offset: 0, OrderBy: "created_at", Order: "DESC"} - webhooks, err := th.webhookRepository.List(options) + webhooks, err := th.webhookRepository.List(ctx, options) assert.Nil(t, err) assert.Len(t, webhooks, 1) assert.Equal(t, webhook2.ID, webhooks[0].ID)