diff options
author | Andreas Brandl <abrandl@gitlab.com> | 2018-02-26 18:44:35 +0300 |
---|---|---|
committer | Andreas Brandl <abrandl@gitlab.com> | 2018-03-06 14:53:13 +0300 |
commit | 375a5c9f1e69a5fbf49a98cecc7f0c0cb61df989 (patch) | |
tree | f748f286a26b82535ad9b261806ee84bee6d66e1 /spec/models | |
parent | 8dde03012f0f3c66333916740483643b193664ad (diff) |
Only track contributions if table is available.
This is due to the problem that the callback can be called while running
an earlier database schema version (for example during earlier
migrations). We work around this by checking the current schema version
and only track contributions if the table is available.
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/event_spec.rb | 10 | ||||
-rw-r--r-- | spec/models/user_contributed_projects_spec.rb | 15 |
2 files changed, 24 insertions, 1 deletions
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 11f6ae74712..445de37d2b1 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -51,11 +51,19 @@ describe Event do end describe 'after_create :track_user_contributed_projects' do + let(:event) { build(:push_event, project: project, author: project.owner) } + it 'passes event to UserContributedProjects.track' do - event = build(:push_event, project: project, author: project.owner) + expect(UserContributedProjects).to receive(:available?).and_return(true) expect(UserContributedProjects).to receive(:track).with(event) event.save end + + it 'does not call UserContributedProjects.track if its not yet available' do + expect(UserContributedProjects).to receive(:available?).and_return(false) + expect(UserContributedProjects).not_to receive(:track) + event.save + end end end diff --git a/spec/models/user_contributed_projects_spec.rb b/spec/models/user_contributed_projects_spec.rb index f92a9d91f8b..092821c8aea 100644 --- a/spec/models/user_contributed_projects_spec.rb +++ b/spec/models/user_contributed_projects_spec.rb @@ -40,6 +40,21 @@ describe UserContributedProjects do end end + describe '.available?' do + before do + described_class.instance_variable_set('@available_flag', nil) + end + + it 'checks schema version and properly caches positive result' do + expect(ActiveRecord::Migrator).to receive(:current_version).and_return(described_class::REQUIRED_SCHEMA_VERSION - 1 - rand(1000)) + expect(described_class.available?).to be_falsey + expect(ActiveRecord::Migrator).to receive(:current_version).and_return(described_class::REQUIRED_SCHEMA_VERSION + rand(1000)) + expect(described_class.available?).to be_truthy + expect(ActiveRecord::Migrator).not_to receive(:current_version) + expect(described_class.available?).to be_truthy # cached response + end + end + it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_presence_of(:user) } end |