summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2018-12-07 11:16:45 -0800
committerStan Hu <stanhu@gmail.com>2018-12-08 22:06:07 -0800
commitcde78f7f4eaec2740c6e91c7d225d701d0097ec0 (patch)
treee62f795f3a92d77c2ac2991e3b95f6c6ded8c6a9 /spec
parent7cb0dd98590e8fdd7483b9f61643a0daa23c2b67 (diff)
downloadgitlab-ce-cde78f7f4eaec2740c6e91c7d225d701d0097ec0.tar.gz
Avoid caching BroadcastMessage as an ActiveRecord object
When a Rails 4 host serializes a BroadcastMessage, it will serialize `ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer`, which does not exist in Rails 5. This will cause Error 500s on a Rails 5 reading from this cache. To make Rails 4 and 5 play well together, store the data as JSON and construct the ActiveRecord objects from JSON. Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/55034
Diffstat (limited to 'spec')
-rw-r--r--spec/models/broadcast_message_spec.rb37
1 files changed, 36 insertions, 1 deletions
diff --git a/spec/models/broadcast_message_spec.rb b/spec/models/broadcast_message_spec.rb
index 5326f9cb8c0..d6e5b557870 100644
--- a/spec/models/broadcast_message_spec.rb
+++ b/spec/models/broadcast_message_spec.rb
@@ -58,6 +58,12 @@ describe BroadcastMessage do
end
end
+ it 'does not create new records' do
+ create(:broadcast_message)
+
+ expect { described_class.current }.not_to change { described_class.count }
+ end
+
it 'includes messages that need to be displayed in the future' do
create(:broadcast_message)
@@ -77,9 +83,37 @@ describe BroadcastMessage do
it 'does not clear the cache if only a future message should be displayed' do
create(:broadcast_message, :future)
- expect(Rails.cache).not_to receive(:delete)
+ expect(Rails.cache).not_to receive(:delete).with(described_class::CACHE_KEY)
expect(described_class.current.length).to eq(0)
end
+
+ it 'clears the legacy cache key' do
+ create(:broadcast_message, :future)
+
+ expect(Rails.cache).to receive(:delete).with(described_class::LEGACY_CACHE_KEY)
+ expect(described_class.current.length).to eq(0)
+ end
+
+ it 'gracefully handles bad cache entry' do
+ allow(described_class).to receive(:current_and_future_messages).and_return('{')
+
+ expect(described_class.current).to be_empty
+ end
+
+ it 'gracefully handles an empty hash' do
+ allow(described_class).to receive(:current_and_future_messages).and_return('{}')
+
+ expect(described_class.current).to be_empty
+ end
+
+ it 'gracefully handles unknown attributes' do
+ message = create(:broadcast_message)
+
+ allow(described_class).to receive(:current_and_future_messages)
+ .and_return([{ bad_attr: 1 }, message])
+
+ expect(described_class.current).to eq([message])
+ end
end
describe '#active?' do
@@ -143,6 +177,7 @@ describe BroadcastMessage do
message = create(:broadcast_message)
expect(Rails.cache).to receive(:delete).with(described_class::CACHE_KEY)
+ expect(Rails.cache).to receive(:delete).with(described_class::LEGACY_CACHE_KEY)
message.flush_redis_cache
end