From 1d69b171b61054f3493b908db3b6fb2003aa9034 Mon Sep 17 00:00:00 2001 From: "Stanko K.R." Date: Thu, 11 Sep 2025 16:56:54 +0200 Subject: [PATCH] Test the abuse prevention logic --- .../fixtures/webhook/delinquency_trackers.yml | 12 +++--- test/fixtures/webhook/deliveries.yml | 22 ++++++---- .../webhook/delinquency_tracker_test.rb | 41 +++++++++++++++++-- test/models/webhook/delivery_test.rb | 5 ++- test/models/webhook_test.rb | 9 ++++ 5 files changed, 72 insertions(+), 17 deletions(-) diff --git a/test/fixtures/webhook/delinquency_trackers.yml b/test/fixtures/webhook/delinquency_trackers.yml index 3a955a4b9..b4d4230b7 100644 --- a/test/fixtures/webhook/delinquency_trackers.yml +++ b/test/fixtures/webhook/delinquency_trackers.yml @@ -1,13 +1,13 @@ # Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - webhook: one - last_reset_at: 2025-09-11 14:45:43 +active_webhook_tracker: + webhook: active + last_reset_at: <%= 1.hour.ago %> total_count: 1 failed_count: 1 -two: - webhook: two - last_reset_at: 2025-09-11 14:45:43 +inactive_webhook_tracker: + webhook: inactive + last_reset_at: <%= 1.hour.ago %> total_count: 1 failed_count: 1 diff --git a/test/fixtures/webhook/deliveries.yml b/test/fixtures/webhook/deliveries.yml index 31fc59c59..bc0464141 100644 --- a/test/fixtures/webhook/deliveries.yml +++ b/test/fixtures/webhook/deliveries.yml @@ -4,24 +4,32 @@ successfully_completed: webhook: active event: logo_published state: completed - request: '{"headers": {}}' - response: '{"code": 200, "headers": {}}' + request: + headers: {} + response: + code: 200 + headers: {} created_at: <%= 1.week.ago %> -successfully_completed: +unsuccessfully_completed: webhook: active event: logo_assignment_jz state: completed - request: '{"headers": {}}' - response: '{"code": 200, "headers": {}}' + request: + headers: {} + response: + code: 422 + headers: {} created_at: <%= 1.week.ago + 1.hour %> errored: webhook: active event: layout_published state: errored - request: '{"headers": {}}' - response: '{"error": "destination_unreachable"}' + request: + headers: {} + response: + error: "destination_unreachable" created_at: <%= 1.week.ago %> pending: diff --git a/test/models/webhook/delinquency_tracker_test.rb b/test/models/webhook/delinquency_tracker_test.rb index 959d63ca4..8e24ab421 100644 --- a/test/models/webhook/delinquency_tracker_test.rb +++ b/test/models/webhook/delinquency_tracker_test.rb @@ -1,7 +1,42 @@ require "test_helper" class Webhook::DelinquencyTrackerTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + test "record_delivery_of" do + tracker = webhook_delinquency_trackers(:active_webhook_tracker) + webhook = tracker.webhook + successful_delivery = webhook_deliveries(:successfully_completed) + failed_delivery = webhook_deliveries(:errored) + + assert_difference -> { tracker.reload.total_count }, +1 do + assert_no_difference -> { tracker.reload.failed_count } do + tracker.record_delivery_of(successful_delivery) + end + end + + assert_difference -> { tracker.reload.total_count }, +1 do + assert_difference -> { tracker.reload.failed_count }, +1 do + tracker.record_delivery_of(failed_delivery) + end + end + + travel_to 13.hours.from_now do + tracker.update!(total_count: 10, failed_count: 5) + + tracker.record_delivery_of(successful_delivery) + tracker.reload + + assert_equal 0, tracker.total_count + assert_equal 0, tracker.failed_count + assert tracker.last_reset_at > 1.minute.ago + end + + travel_to 26.hours.from_now do + tracker.update!(total_count: 50, failed_count: 50) + webhook.activate + + assert_changes -> { webhook.reload.active? }, from: true, to: false do + tracker.record_delivery_of(failed_delivery) + end + end + end end diff --git a/test/models/webhook/delivery_test.rb b/test/models/webhook/delivery_test.rb index 1a15c05f3..d0fdaeae9 100644 --- a/test/models/webhook/delivery_test.rb +++ b/test/models/webhook/delivery_test.rb @@ -55,7 +55,10 @@ class Webhook::DeliveryTest < ActiveSupport::TestCase assert_equal "pending", delivery.state - delivery.deliver + tracker = delivery.webhook.delinquency_tracker + assert_difference -> { tracker.reload.total_count }, 1 do + delivery.deliver + end assert delivery.persisted? assert_equal "completed", delivery.state diff --git a/test/models/webhook_test.rb b/test/models/webhook_test.rb index 43dc66ed3..096b2223a 100644 --- a/test/models/webhook_test.rb +++ b/test/models/webhook_test.rb @@ -6,6 +6,7 @@ class WebhookTest < ActiveSupport::TestCase assert webhook.persisted? assert webhook.active? assert webhook.signing_secret.present? + assert webhook.delinquency_tracker.present? end test "validates the url" do @@ -43,4 +44,12 @@ class WebhookTest < ActiveSupport::TestCase webhook.deactivate end end + + test "activate" do + webhook = webhooks(:inactive) + + assert_changes -> { webhook.active? }, from: false, to: true do + webhook.activate + end + end end