docbrown/spec/requests/api/v0/organizations_spec.rb
Spencer 27648a938b
API: Endpoint to get an organization's articles (#12237)
* update route

* add controller action

* add article jbuilder/update shared files

* add tests

* update api docs

* add published to query

* render articles index/delete articles jbuilder

* call articles index attributes const

* put back article/flare partials

* bug fix for readinglist index

* bug fix for render partial in jbuilder
2021-01-13 13:09:58 +01:00

161 lines
6.4 KiB
Ruby

require "rails_helper"
RSpec.describe "Api::V0::Organizations", type: :request do
describe "GET /api/organizations/:username" do
let(:organization) { create(:organization) }
it "returns 404 if the organizations username is not found" do
get "/api/organizations/invalid-username"
expect(response).to have_http_status(:not_found)
end
it "returns the correct json representation of the organization", :aggregate_failures do
get api_organization_path(organization.username)
response_organization = response.parsed_body
expect(response_organization).to include(
{
"profile_image" => organization.profile_image_url,
"type_of" => "organization",
"joined_at" => organization.created_at.utc.iso8601
},
)
%w[
username name summary twitter_username github_username url location tech_stack tag_line story
].each do |attr|
expect(response_organization[attr]).to eq(organization.public_send(attr))
end
end
end
describe "GET /api/organizations/:username/users" do
let!(:org_user) { create(:user, :org_member) }
let(:organization) { org_user.organizations.first }
it "returns 404 if the organizations username is not found" do
get "/api/organizations/invalid-username/users"
expect(response).to have_http_status(:not_found)
end
it "supports pagination" do
create(:organization_membership, user: create(:user), organization: organization)
get api_organization_users_path(organization.username), params: { page: 1, per_page: 1 }
expect(response.parsed_body.length).to eq(1)
get api_organization_users_path(organization.username), params: { page: 2, per_page: 1 }
expect(response.parsed_body.length).to eq(1)
get api_organization_users_path(organization.username), params: { page: 3, per_page: 1 }
expect(response.parsed_body.length).to eq(0)
end
it "returns the correct json representation of the organizations users", :aggregate_failures do
get api_organization_users_path(organization.username)
response_org_users = response.parsed_body.first
expect(response_org_users["type_of"]).to eq("user")
%w[
id username name summary twitter_username github_username website_url location
].each do |attr|
expect(response_org_users[attr]).to eq(org_user.public_send(attr))
end
expect(response_org_users["joined_at"]).to eq(org_user.created_at.strftime("%b %e, %Y"))
expect(response_org_users["profile_image"]).to eq(Images::Profile.call(org_user.profile_image_url, length: 320))
end
end
describe "GET /api/organizations/:username/listings" do
let(:org_user) { create(:user, :org_member) }
let(:organization) { org_user.organizations.first }
let!(:listing) { create(:listing, user: org_user, organization: organization) }
it "returns 404 if the organizations username is not found" do
get "/api/organizations/invalid-username/listings"
expect(response).to have_http_status(:not_found)
end
it "supports pagination" do
create(:listing, user: org_user, organization: organization)
get api_organization_listings_path(organization.username), params: { page: 1, per_page: 1 }
expect(response.parsed_body.length).to eq(1)
get api_organization_listings_path(organization.username), params: { page: 2, per_page: 1 }
expect(response.parsed_body.length).to eq(1)
get api_organization_listings_path(organization.username), params: { page: 3, per_page: 1 }
expect(response.parsed_body.length).to eq(0)
end
it "returns the correct json representation of the organizations listings", :aggregate_failures do
get api_organization_listings_path(organization.username)
response_listing = response.parsed_body.first
expect(response_listing["type_of"]).to eq("listing")
%w[id title slug body_markdown category processed_html published listing_category_id].each do |attr|
expect(response_listing[attr]).to eq(listing.public_send(attr))
end
expect(response_listing["tag_list"]).to eq(listing.cached_tag_list)
expect(response_listing["tags"]).to match_array(listing.tag_list)
%w[name username twitter_username github_username website_url].each do |attr|
expect(response_listing["user"][attr]).to eq(org_user.public_send(attr))
end
%w[name username slug].each do |attr|
expect(response_listing["organization"][attr]).to eq(organization.public_send(attr))
end
end
end
describe "GET /api/organizations/:username/articles" do
let(:org_user) { create(:user, :org_member) }
let(:organization) { org_user.organizations.first }
let!(:article) { create(:article, user: org_user, organization: organization) }
it "returns 404 if the organizations articles is not found" do
get "/api/organizations/invalid-username/articles"
expect(response).to have_http_status(:not_found)
end
it "supports pagination" do
create(:article, organization: organization)
get api_organization_articles_path(organization.username), params: { page: 1, per_page: 1 }
expect(response.parsed_body.length).to eq(1)
get api_organization_articles_path(organization.username), params: { page: 2, per_page: 1 }
expect(response.parsed_body.length).to eq(1)
get api_organization_articles_path(organization.username), params: { page: 3, per_page: 1 }
expect(response.parsed_body.length).to eq(0)
end
it "returns the correct json representation of the organizations articles", :aggregate_failures do
get api_organization_articles_path(organization.username)
response_article = response.parsed_body.first
expect(response_article["type_of"]).to eq("article")
%w[id title slug description path public_reactions_count
positive_reactions_count comments_count published_timestamp].each do |attr|
expect(response_article[attr]).to eq(article.public_send(attr))
end
expect(response_article["tag_list"]).to match_array(article.tag_list)
%w[name username twitter_username github_username website_url].each do |attr|
expect(response_article["user"][attr]).to eq(org_user.public_send(attr))
end
%w[name username slug].each do |attr|
expect(response_article["organization"][attr]).to eq(organization.public_send(attr))
end
end
end
end