mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-27 21:06:49 +00:00
106 lines
3.1 KiB
Ruby
106 lines
3.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative "../spec_helper"
|
|
|
|
RSpec.describe DfcRequest do
|
|
subject(:api) { DfcRequest.new(user) }
|
|
|
|
let(:user) { build(:oidc_user) }
|
|
let(:account) { user.oidc_account }
|
|
|
|
it "gets a DFC document" do
|
|
stub_request(:get, "http://example.net/api").
|
|
to_return(status: 200, body: '{"@context":"/"}')
|
|
|
|
expect(api.call("http://example.net/api")).to eq '{"@context":"/"}'
|
|
end
|
|
|
|
it "posts a DFC document" do
|
|
json = '{"name":"new season apples"}'
|
|
stub_request(:post, "http://example.net/api").
|
|
with(body: json).
|
|
to_return(status: 201) # Created
|
|
|
|
expect(api.call("http://example.net/api", json)).to eq ""
|
|
end
|
|
|
|
it "refreshes the access token on fail", vcr: true do
|
|
# Live VCR recordings require the following secret ENV variables:
|
|
# - OPENID_APP_ID
|
|
# - OPENID_APP_SECRET
|
|
# - OPENID_REFRESH_TOKEN
|
|
# You can set them in the .env.test.local file.
|
|
|
|
stub_request(:get, "http://example.net/api").
|
|
to_return(status: 401)
|
|
|
|
# A refresh is only attempted if the token is stale.
|
|
account.refresh_token = ENV.fetch("OPENID_REFRESH_TOKEN")
|
|
account.updated_at = 1.day.ago
|
|
|
|
expect { api.call("http://example.net/api") }
|
|
.to raise_error(Faraday::UnauthorizedError)
|
|
.and change { account.token }
|
|
.and change { account.refresh_token }
|
|
end
|
|
|
|
it "doesn't try to refresh the token when it's still fresh" do
|
|
stub_request(:get, "http://example.net/api").
|
|
to_return(status: 401)
|
|
|
|
user.oidc_account.updated_at = 1.minute.ago
|
|
|
|
expect { api.call("http://example.net/api") }
|
|
.to raise_error(Faraday::UnauthorizedError)
|
|
|
|
# Trying to reach the OIDC server via network request to refresh the token
|
|
# would raise errors because we didn't setup Webmock or VCR.
|
|
# The absence of errors makes this test pass.
|
|
end
|
|
|
|
it "clears invalid refresh tokens", vcr: true do
|
|
stub_request(:get, "http://example.net/api").to_return(status: 401)
|
|
|
|
account.refresh_token = "some-invalid-token"
|
|
account.updated_at = 1.day.ago
|
|
|
|
expect { api.call("http://example.net/api") }
|
|
.to raise_error(Rack::OAuth2::Client::Error)
|
|
|
|
expect(account.refresh_token).to eq nil
|
|
end
|
|
|
|
it "refreshes the access token and retrieves the FDC catalog", vcr: true do
|
|
# A refresh is only attempted if the token is stale.
|
|
account.uid = "testdfc@protonmail.com"
|
|
account.refresh_token = ENV.fetch("OPENID_REFRESH_TOKEN")
|
|
account.updated_at = 1.day.ago
|
|
|
|
response = nil
|
|
expect {
|
|
response = api.call(
|
|
"https://env-0105831.jcloud-ver-jpe.ik-server.com/api/dfc/Enterprises/test-hodmedod/SuppliedProducts"
|
|
)
|
|
}.to change {
|
|
account.token
|
|
}.and change {
|
|
account.refresh_token
|
|
}
|
|
|
|
json = JSON.parse(response)
|
|
|
|
graph = DfcIo.import(json)
|
|
products = graph.select { |s| s.semanticType == "dfc-b:SuppliedProduct" }
|
|
expect(products).to be_present
|
|
end
|
|
|
|
it "reports and raises server errors" do
|
|
stub_request(:get, "http://example.net/api").to_return(status: 500)
|
|
|
|
expect(Bugsnag).to receive(:notify)
|
|
|
|
expect { api.call("http://example.net/api") }
|
|
.to raise_error(Faraday::ServerError)
|
|
end
|
|
end
|