From f980cb45f61e3bab5055e94dbb2c5f0b7d62276e Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 2 Oct 2024 11:00:42 +1000 Subject: [PATCH] Add logic for ConnectedApps::Vine#connect and disconnect --- app/models/connected_apps/vine.rb | 16 ++++++--- config/locales/en.yml | 3 ++ spec/models/connected_apps/vine_spec.rb | 45 +++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 spec/models/connected_apps/vine_spec.rb 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