bd259f7795
Instead of writer pinning, we'll track the last transaction ID of each write in the session. Then on each read we'll wait for the replica to report that this transaction is available. If it doesn't become available within a reasonable timeout, we'll proceed anyway, and accept the possibility of a stale read. The hope here is that most of the time, the replica is caught up in the time between a write request and the following read request. If it's not, we now have a little tolerance to wait for it, which hopefully proves enough to stale reads are not encountered in normal use. We also disable the writer affinity opt-out mechanism that we had before, since we will no longer be using writer affinity at the load balancer.
76 lines
2.3 KiB
Ruby
76 lines
2.3 KiB
Ruby
require "test_helper"
|
|
|
|
class Cards::ReadingsControllerTest < ActionDispatch::IntegrationTest
|
|
setup do
|
|
sign_in_as :kevin
|
|
end
|
|
|
|
test "create" do
|
|
freeze_time
|
|
|
|
assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: false, to: true do
|
|
assert_changes -> { accesses(:writebook_kevin).reload.accessed_at }, from: nil, to: Time.current do
|
|
post card_reading_url(cards(:logo)), as: :turbo_stream
|
|
end
|
|
end
|
|
|
|
assert_response :success
|
|
end
|
|
|
|
test "read one notification on card visit" do
|
|
assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: false, to: true do
|
|
post card_reading_path(cards(:logo)), as: :turbo_stream
|
|
end
|
|
|
|
assert_response :success
|
|
end
|
|
|
|
test "read multiple notifications on card visit" do
|
|
assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: false, to: true do
|
|
assert_changes -> { notifications(:logo_assignment_kevin).reload.read? }, from: false, to: true do
|
|
post card_reading_path(cards(:logo)), as: :turbo_stream
|
|
end
|
|
end
|
|
|
|
assert_response :success
|
|
end
|
|
|
|
test "destroy" do
|
|
freeze_time
|
|
|
|
notifications(:logo_published_kevin).read
|
|
notifications(:logo_assignment_kevin).read
|
|
|
|
assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: true, to: false do
|
|
assert_changes -> { accesses(:writebook_kevin).reload.accessed_at }, to: Time.current do
|
|
delete card_reading_url(cards(:logo)), as: :turbo_stream
|
|
end
|
|
end
|
|
|
|
assert_response :success
|
|
end
|
|
|
|
test "unread one notification on destroy" do
|
|
notifications(:logo_published_kevin).read
|
|
|
|
assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: true, to: false do
|
|
delete card_reading_path(cards(:logo)), as: :turbo_stream
|
|
end
|
|
|
|
assert_response :success
|
|
end
|
|
|
|
test "unread multiple notifications on destroy" do
|
|
notifications(:logo_published_kevin).read
|
|
notifications(:logo_assignment_kevin).read
|
|
|
|
assert_changes -> { notifications(:logo_published_kevin).reload.read? }, from: true, to: false do
|
|
assert_changes -> { notifications(:logo_assignment_kevin).reload.read? }, from: true, to: false do
|
|
delete card_reading_path(cards(:logo)), as: :turbo_stream
|
|
end
|
|
end
|
|
|
|
assert_response :success
|
|
end
|
|
end
|