Files
openfoodnetwork/engines/dfc_provider/spec/requests/enterprises_spec.rb
2025-10-10 16:18:22 +11:00

181 lines
5.2 KiB
Ruby

# frozen_string_literal: true
require_relative "../swagger_helper"
RSpec.describe "Enterprises", swagger_doc: "dfc.yaml" do
let(:Authorization) { nil }
let!(:user) { create(:oidc_user) }
let!(:enterprise) do
create(
:distributor_enterprise, :with_logo_image, :with_promo_image,
id: 10_000, owner: user, abn: "123 456", name: "Fred's Farm",
description: "This is an awesome enterprise",
contact_name: "Fred Farmer",
facebook: "https://facebook.com/user",
email_address: "hello@example.org",
phone: "0404 444 000 200",
website: "https://openfoodnetwork.org",
address:,
)
end
let(:address) {
build(
:address,
id: 40_000, address1: "42 Doveton Street",
latitude: -25.345376, longitude: 131.0312006,
)
}
let!(:other_enterprise) do
create(
:distributor_enterprise,
id: 10_001, owner: user, abn: "123 457", name: "Fred's Icecream",
description: "We use our strawberries to make icecream.",
address: build(:address, id: 40_001, address1: "42 Doveton Street"),
)
end
let!(:enterprise_group) do
create(
:enterprise_group,
id: 60_000, owner: user, name: "Local Farmers",
enterprises: [enterprise],
)
end
let!(:product) {
create(
:product_with_image,
id: 90_000, name: "Apple", description: "Round",
variants: [variant],
primary_taxon: non_local_vegetable
)
}
let(:non_local_vegetable) {
build(
:taxon,
name: "Non Local Vegetable",
dfc_id: "https://github.com/datafoodconsortium/taxonomies/releases/latest/download/productTypes.rdf#non-local-vegetable"
)
}
let(:variant) {
build(:base_variant, id: 10_001, unit_value: 1, sku: "APP", supplier: enterprise)
}
before { login_as user }
path "/api/dfc/enterprises" do
get "List enterprises" do
produces "application/json"
response "200", "successful" do
context "as platform user" do
include_context "authenticated as platform"
context "without permissions" do
run_test! do
expect(response.body).to eq ""
end
end
context "with access to one enterprise" do
before do
DfcPermission.create!(
user:, enterprise_id: enterprise.id,
scope: "ReadEnterprise", grantee: "cqcm-dev",
)
end
run_test! do
expect(response.body).to include "Fred's Farm"
expect(response.body).not_to include "Fred's Icecream"
end
end
context "with access to two enterprises" do
before do
DfcPermission.create!(
user:, enterprise_id: enterprise.id,
scope: "ReadEnterprise", grantee: "cqcm-dev",
)
DfcPermission.create!(
user:, enterprise_id: other_enterprise.id,
scope: "ReadEnterprise", grantee: "cqcm-dev",
)
end
run_test! do
expect(response.body).to include "Fred's Farm"
expect(response.body).to include "Fred's Icecream"
end
end
end
context "as user owning two enterprises" do
run_test! do
expect(response.body).to include "Fred's Farm"
expect(response.body).to include "Fred's Icecream"
end
end
end
end
end
path "/api/dfc/enterprises/{id}" do
get "Show enterprise" do
parameter name: :id, in: :path, type: :string
produces "application/json"
response "200", "successful" do
context "as platform user" do
include_context "authenticated as platform"
let(:id) { 10_000 }
before {
DfcPermission.create!(
user:, enterprise_id: id,
scope: "ReadEnterprise", grantee: "cqcm-dev",
)
}
run_test!
end
context "without enterprise id" do
let(:id) { "default" }
run_test! do
expect(response.body).to include("Apple")
expect(response.body).to include("APP")
expect(response.body).to include("offers/10001")
end
end
context "given an enterprise id" do
let(:id) { enterprise.id }
run_test! do
expect(response.body).to include "Fred's Farm"
expect(response.body).to include "This is an awesome enterprise"
expect(response.body).to include "123 456"
expect(response.body).to include "Apple"
expect(response.body).to include "42 Doveton Street"
expect(json_response["@graph"][0]).to include(
"dfc-b:affiliates" => "http://test.host/api/dfc/enterprise_groups/60000",
"dfc-b:websitePage" => "https://openfoodnetwork.org",
)
end
end
end
response "404", "not found" do
let(:id) { other_enterprise.id }
let(:other_enterprise) { create(:distributor_enterprise) }
run_test! do
expect(response.body).not_to include "Apple"
end
end
end
end
end