docbrown/spec/requests/api/v1/docs/organizations_spec.rb
Duke Greene 9a6f04bd37
api v1 endpoint for creating an organization (#19778)
* api v1 endpoint for creating an organization

* address failing specs, regenerate swagger docs

* remove old comment in destroy now that woreker call takes third argument

* refactor our services for profile images into images folder
2023-07-21 07:43:56 -04:00

348 lines
11 KiB
Ruby

require "rails_helper"
require "swagger_helper"
# rubocop:disable RSpec/EmptyExampleGroup
# rubocop:disable RSpec/VariableName
RSpec.describe "Api::V1::Docs::Organizations" do
let(:Accept) { "application/vnd.forem.api-v1+json" }
let(:organization) { create(:organization) }
describe "GET /api/organizations/{username}" do
before do
create_list(:user, 2).map do |user|
create(:organization_membership, user: user, organization: organization)
end
create(:article, organization: organization)
end
path "/api/organizations/{username}" do
get "An organization (by username)" do
tags "organizations"
security []
description "This endpoint allows the client to retrieve a single organization by their username"
operationId "getOrganization"
produces "application/json"
parameter name: :username, in: :path, type: :string, required: true
response "200", "An Organization" do
let(:username) { organization.username }
schema type: :object,
items: { "$ref": "#/components/schemas/Organization" }
add_examples
run_test!
end
response "404", "Not Found" do
let(:username) { "non-existent-username" }
add_examples
run_test!
end
end
end
path "/api/organizations/{username}/users" do
get "Organization's users" do
tags "organizations", "users"
security []
description "This endpoint allows the client to retrieve a list of users belonging to the organization
It supports pagination, each page will contain `30` users by default."
operationId "getOrgUsers"
produces "application/json"
parameter name: :username, in: :path, type: :string, required: true
parameter "$ref": "#/components/parameters/pageParam"
parameter "$ref": "#/components/parameters/perPageParam30to1000"
response "200", "An Organization's users" do
let(:username) { organization.username }
schema type: :array,
items: { "$ref": "#/components/schemas/User" }
add_examples
run_test!
end
response "404", "Not Found" do
let(:username) { "non-existent-username" }
add_examples
run_test!
end
end
end
path "/api/organizations/{username}/articles" do
get "Organization's Articles" do
tags "organizations", "articles"
security []
description "This endpoint allows the client to retrieve a list of Articles belonging to the organization
It supports pagination, each page will contain `30` users by default."
operationId "getOrgArticles"
produces "application/json"
parameter name: :username, in: :path, type: :string, required: true
parameter "$ref": "#/components/parameters/pageParam"
parameter "$ref": "#/components/parameters/perPageParam30to1000"
response "200", "An Organization's Articles" do
let(:username) { organization.username }
schema type: :array,
items: { "$ref": "#/components/schemas/ArticleIndex" }
add_examples
run_test!
end
response "404", "Not Found" do
let(:username) { "non-existent-username" }
add_examples
run_test!
end
end
end
end
describe "GET /api/organizations" do
before do
create(:organization)
end
path "/api/organizations" do
get "Organizations" do
tags "organizations"
security []
description "This endpoint allows the client to retrieve a list of Dev organizations.
It supports pagination, each page will contain 10 tags by default."
operationId "getOrganizations"
produces "application/json"
parameter "$ref": "#/components/parameters/pageParam"
parameter "$ref": "#/components/parameters/perPageParam10to1000"
response "200", "A list of all organizations" do
schema type: :array,
items: { "$ref": "#/components/schemas/Organization" }
add_examples
run_test!
end
end
end
end
describe "GET /api/organizations/{id}" do
let!(:organization) { create(:organization) }
path "/api/organizations/{id}" do
get "An organization (by id)" do
tags "organizations"
security []
description "This endpoint allows the client to retrieve a single organization by their id"
operationId "getOrganizationById"
produces "application/json"
parameter name: :id, in: :path, type: :integer, required: true
response "200", "An Organization" do
let(:id) { organization.id }
schema type: :object,
items: { "$ref": "#/components/schemas/Organization" }
add_examples
run_test!
end
response "404", "Not Found" do
let(:id) { 0 }
add_examples
run_test!
end
end
end
end
describe "POST /api/organizations" do
let(:api_secret) { create(:api_secret, user: create(:user, :super_admin)) }
let(:image_url) { "https://dummyimage.com/800x600.jpg" }
let(:org_params) do
{
name: "New Test Org",
summary: "a newly created test org",
url: "https://testorg.io",
profile_image: image_url,
slug: "org10001",
tag_line: "a test org's tagline"
}
end
path "/api/organizations" do
post "Create an Organization" do
tags "organizations"
description "This endpoint allows the client to create an organization with the provided parameters.
It requires a token from a user with `admin` privileges."
operationId "createOrganization"
produces "application/json"
consumes "application/json"
parameter name: :organization,
in: :body,
description: "Representation of Organization to be created",
schema: { "$ref": "#/components/schemas/Organization" }
response "201", "Successful" do
before do
# mocking out the process where carrierwave takes the image at the url and uploads
stub_request(:get, "https://dummyimage.com").to_return(body: "", status: 200)
organization = Organization.new(org_params)
allow(Organization).to receive(:new).and_return(organization)
profile_image = Images::ProfileImageGenerator.call
allow(organization).to receive(:profile_image).and_return(profile_image)
# presence of image file allows save, mocking the upload in specs means file won't respond to :url
allow(organization).to receive(:profile_image_url).and_return(
"uploads/organization/profile_image/1/400x400.jpg",
)
end
let(:"api-key") { api_secret.secret }
let(:organization) do
{
organization: {
name: "New Test Org",
summary: "a newly created test org",
url: "https://testorg.io",
profile_image: image_url,
slug: "org10001",
tag_line: "a test org's tagline"
}
}
end
add_examples
run_test!
end
response "401", "Unauthorized" do
# Only site admins can create organizations through the v1 api
let(:reg_admin_user) { create(:user, :admin) }
let(:api_secret) { create(:api_secret, user: reg_admin_user) }
let(:"api-key") { api_secret.secret }
let(:organization) { {} }
examples
run_test!
end
response "422", "Unprocessable Entity" do
let(:"api-key") { api_secret.secret }
let(:organization) { {} }
add_examples
run_test!
end
end
end
end
describe "PUT /api/organizations/{id}" do
let!(:org_admin) { create(:user, :org_admin, :admin) }
let(:api_secret) { create(:api_secret, user: org_admin) }
let!(:org_to_update) { org_admin.organizations.first }
path "/api/organizations/{id}" do
put "Update an organization by id" do
tags "organizations"
description "This endpoint allows the client to update an existing organization."
produces "application/json"
consumes "application/json"
parameter name: :id,
in: :path,
required: true,
description: "The ID of the organization to update.",
schema: {
type: :integer,
format: :int32,
minimum: 1
},
example: 123
parameter name: :organization,
in: :body,
description: "Representation of Organization to be updated",
schema: { "$ref": "#/components/schemas/Organization" }
response "200", "An Organization" do
let(:"api-key") { api_secret.secret }
let(:id) { org_to_update.id }
let(:organization) { { organization: { summary: "An updated summary for the organization." } } }
add_examples
run_test!
end
response "404", "organization Not Found" do
let(:"api-key") { api_secret.secret }
let(:id) { 1_234_567_890 }
let(:organization) { org_to_update.assign_attributes(name: "this won't update, unfindable id") }
add_examples
run_test!
end
response "401", "Unauthorized" do
let!(:org_admin) { create(:user, :org_member) }
let(:"api-key") { api_secret.secret }
let(:id) { org_to_update.id }
let(:organization) { org_to_update.assign_attributes(summary: "won't update, non-admin user privileges") }
add_examples
run_test!
end
response "422", "Unprocessable Entity" do
let(:"api-key") { api_secret.secret }
let(:id) { org_to_update.id }
let(:organization) { { profile_image: "" } }
add_examples
run_test!
end
end
end
end
describe "DELETE /api/organizations/{id}" do
let!(:super_admin) { create(:user, :org_admin, :super_admin) }
let(:super_api_secret) { create(:api_secret, user: super_admin) }
let!(:org_to_delete) { super_admin.organizations.first }
path "/api/organizations/{id}" do
delete "Delete an Organization by id" do
tags "organizations"
description "This endpoint allows the client to delete a single organization, specified by id"
produces "application/json"
parameter name: :id, in: :path, required: true,
description: "The ID of the organization.",
schema: {
type: :integer,
format: :int32,
minimum: 1
},
example: 1
let(:id) { org_to_delete.id }
response(200, "successful") do
let(:"api-key") { super_api_secret.secret }
add_examples
run_test!
end
response "401", "unauthorized" do
let(:"api-key") { "invalid" }
add_examples
run_test!
end
end
end
end
end
# rubocop:enable RSpec/EmptyExampleGroup
# rubocop:enable RSpec/VariableName