diff --git a/app/models/connected_apps/vine.rb b/app/models/connected_apps/vine.rb index 46fad0f1c1..f32858d0b2 100644 --- a/app/models/connected_apps/vine.rb +++ b/app/models/connected_apps/vine.rb @@ -4,12 +4,18 @@ # module ConnectedApps class Vine < ConnectedApp - def connect(api_key: ) - # TODO + VINE_API_URL = "https://vine-staging.openfoodnetwork.org.au/api/v1/my-team" + + def connect(api_key:, vine_api:, **_opts) + response = vine_api.my_team + + return update data: { api_key: } if response.success? + + errors.add(:base, I18n.t("activerecord.errors.models.connected_apps.vine.api_request_error")) + + false end - def disconnect - # TODO - end + def disconnect; end end end diff --git a/config/locales/en.yml b/config/locales/en.yml index da1bbe8043..d0136b68ad 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -128,6 +128,9 @@ en: count_on_hand: using_producer_stock_settings_but_count_on_hand_set: "must be blank because using producer stock settings" limited_stock_but_no_count_on_hand: "must be specified because forcing limited stock" + connected_apps: + vine: + api_request_error: "An error occured when connecting to Vine API" messages: confirmation: "doesn't match %{attribute}" blank: "can't be blank" diff --git a/spec/models/connected_apps/vine_spec.rb b/spec/models/connected_apps/vine_spec.rb new file mode 100644 index 0000000000..7d94d3693e --- /dev/null +++ b/spec/models/connected_apps/vine_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe ConnectedApps::Vine do + subject(:connected_app) { ConnectedApps::Vine.new(enterprise: create(:enterprise)) } + + let(:vine_api_key) { "12345" } + let(:vine_api) { instance_double(VineApiService) } + + describe "#connect" do + it "send a request to VINE api" do + expect(vine_api).to receive(:my_team).and_return(mock_api_response(true)) + + connected_app.connect(api_key: vine_api_key, vine_api: ) + end + + context "when request succeed", :vcr do + it "store the vine api key" do + allow(vine_api).to receive(:my_team).and_return(mock_api_response(true)) + + expect(connected_app.connect(api_key: vine_api_key, vine_api:)).to eq(true) + expect(connected_app.data).to eql({ "api_key" => vine_api_key }) + end + end + + context "when request fails" do + it "doesn't store the vine api key" do + allow(vine_api).to receive(:my_team).and_return(mock_api_response(false)) + + expect(connected_app.connect(api_key: vine_api_key, vine_api:)).to eq(false) + expect(connected_app.data).to be_nil + expect(connected_app.errors[:base]).to include( + "An error occured when connecting to Vine API" + ) + end + end + end + + def mock_api_response(success) + mock_response = instance_double(Faraday::Response) + allow(mock_response).to receive(:success?).and_return(success) + mock_response + end +end