Commit a8d71143 authored by Vladlena Shumilo's avatar Vladlena Shumilo Committed by Kerri Miller

Fix SyncSeatLinkRequestWorker license duplication

parent 186c51b5
...@@ -24,7 +24,7 @@ class SyncSeatLinkRequestWorker ...@@ -24,7 +24,7 @@ class SyncSeatLinkRequestWorker
) )
if response.success? if response.success?
create_license(response['license']) if response['license'] reset_license!(response['license']) if response['license']
else else
raise RequestError, request_error_message(response) raise RequestError, request_error_message(response)
end end
...@@ -32,8 +32,13 @@ class SyncSeatLinkRequestWorker ...@@ -32,8 +32,13 @@ class SyncSeatLinkRequestWorker
private private
def create_license(license_data) def reset_license!(license_data)
License.create!(data: license_data, cloud: true) current_license = License.current if License.current&.cloud_license?
License.transaction do
current_license&.destroy!
License.create!(data: license_data, cloud: true)
end
rescue StandardError => e rescue StandardError => e
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
end end
......
...@@ -4,7 +4,7 @@ require 'spec_helper' ...@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe SyncSeatLinkRequestWorker, type: :worker do RSpec.describe SyncSeatLinkRequestWorker, type: :worker do
describe '#perform' do describe '#perform' do
subject do subject(:sync_seat_link) do
described_class.new.perform('2020-01-01T01:20:12+02:00', '123', 5, 4) described_class.new.perform('2020-01-01T01:20:12+02:00', '123', 5, 4)
end end
...@@ -13,7 +13,7 @@ RSpec.describe SyncSeatLinkRequestWorker, type: :worker do ...@@ -13,7 +13,7 @@ RSpec.describe SyncSeatLinkRequestWorker, type: :worker do
it 'makes an HTTP POST request with passed params' do it 'makes an HTTP POST request with passed params' do
stub_request(:post, seat_link_url).to_return(status: 200) stub_request(:post, seat_link_url).to_return(status: 200)
subject sync_seat_link
expect(WebMock).to have_requested(:post, seat_link_url).with( expect(WebMock).to have_requested(:post, seat_link_url).with(
headers: { 'Content-Type' => 'application/json' }, headers: { 'Content-Type' => 'application/json' },
...@@ -38,36 +38,76 @@ RSpec.describe SyncSeatLinkRequestWorker, type: :worker do ...@@ -38,36 +38,76 @@ RSpec.describe SyncSeatLinkRequestWorker, type: :worker do
body: body, body: body,
headers: { content_type: 'application/json' } headers: { content_type: 'application/json' }
) )
allow(License).to receive(:current).and_return(current_license)
end end
it 'persists returned license' do shared_examples 'successful license creation' do
expect { subject }.to change(License, :count).by(1) it 'persists the new license' do
expect(License.last).to have_attributes( expect { sync_seat_link }.to change(License, :count).by(1)
data: license_key, expect(License.last).to have_attributes(
cloud: true data: license_key,
) cloud: true
)
end
end end
context 'when persisting fails' do context 'when there is no previous license' do
let(:license_key) { 'invalid-key' } let(:current_license) { nil }
it_behaves_like 'successful license creation'
end
context 'when there is a previous license' do
context 'when it is a cloud license' do
let(:current_license) { create(:license, cloud: true) }
it 'persists the new license and deletes the current one' do
expect { sync_seat_link }.not_to change(License, :count)
expect(License.last).to have_attributes(data: license_key, cloud: true)
expect(License).not_to exist(current_license.id)
end
context 'when persisting fails' do
let(:license_key) { 'invalid-key' }
it 'does not delete the current license and logs error' do
expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).and_call_original
expect { sync_seat_link }.to raise_error
expect(License).to exist(current_license.id)
end
end
context 'when deleting fails' do
it 'does not create a new license and logs error' do
last_license = License.last
allow(current_license).to receive(:destroy!).and_raise
expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).and_call_original
expect { sync_seat_link }.to raise_error
expect(License.last).to eq(last_license)
end
end
end
it 'logs error' do context 'when it is not a cloud license' do
expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).and_call_original let(:current_license) { create(:license) }
expect { subject }.to raise_error it_behaves_like 'successful license creation'
end end
end end
end end
context 'with old date format string' do context 'with old date format string' do
subject do subject(:sync_seat_link) do
described_class.new.perform('2020-01-01', '123', 5, 4) described_class.new.perform('2020-01-01', '123', 5, 4)
end end
it 'makes an HTTP POST request with passed params' do it 'makes an HTTP POST request with passed params' do
stub_request(:post, seat_link_url).to_return(status: 200) stub_request(:post, seat_link_url).to_return(status: 200)
subject sync_seat_link
expect(WebMock).to have_requested(:post, seat_link_url).with( expect(WebMock).to have_requested(:post, seat_link_url).with(
headers: { 'Content-Type' => 'application/json' }, headers: { 'Content-Type' => 'application/json' },
...@@ -91,7 +131,7 @@ RSpec.describe SyncSeatLinkRequestWorker, type: :worker do ...@@ -91,7 +131,7 @@ RSpec.describe SyncSeatLinkRequestWorker, type: :worker do
end end
it 'raises an error with the expected message' do it 'raises an error with the expected message' do
expect { subject }.to raise_error( expect { sync_seat_link }.to raise_error(
described_class::RequestError, described_class::RequestError,
'Seat Link request failed! Code:400 Body:{"success":false,"error":"Bad Request"}' 'Seat Link request failed! Code:400 Body:{"success":false,"error":"Bad Request"}'
) )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment