We're disabling `action_controller.raise_on_missing_callback_actions` because sometimes we include `before_action :something, only: actions` in concerns, and we include these concerns in controllers that don't have all these actions. Note that Rails 7.1 logs to STDOUT by default [1]; we're re-adding the condition `if ENV["RAILS_LOG_TO_STDOUT"].present?` because we're still using files and we're rotating the logs to avoid running out of space. Also note that the GraphQL controller test (which is actually a request test, since it's got `type: :request`) that was raising an exception no longer does it thanks to the new default value for the `config.action_dispatch.show_exceptions` configuration option. So we're updating the test accordingly. This option doesn't affect regular controller tests (without the `type: :request` option), so in other tests we're still checking exceptions. [1] Pull request 47138 in https://github.com/rails/rails
103 lines
3.2 KiB
Ruby
103 lines
3.2 KiB
Ruby
require "rails_helper"
|
|
|
|
# Useful resource: http://graphql.org/learn/serving-over-http/
|
|
|
|
describe GraphqlController, type: :request do
|
|
let(:proposal) { create(:proposal) }
|
|
let(:query_string) { "{ proposal(id: #{proposal.id}) { title } }" }
|
|
|
|
describe "handles GET request" do
|
|
specify "with query string inside query params" do
|
|
get "/graphql", params: { query: query_string }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.parsed_body["data"]["proposal"]["title"]).to eq(proposal.title)
|
|
end
|
|
|
|
specify "with malformed query string" do
|
|
get "/graphql", params: { query: "Malformed query string" }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.parsed_body["data"]).to be nil
|
|
expect(response.parsed_body["errors"]).to be_present
|
|
end
|
|
|
|
specify "without query string" do
|
|
get "/graphql"
|
|
|
|
expect(response).to have_http_status(:bad_request)
|
|
expect(response.parsed_body["message"]).to eq("Query string not present")
|
|
end
|
|
end
|
|
|
|
describe "handles POST request" do
|
|
let(:json_headers) { { "CONTENT_TYPE" => "application/json" } }
|
|
|
|
specify "with json-encoded query string inside body" do
|
|
post "/graphql", params: { query: query_string }.to_json,
|
|
headers: json_headers
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.parsed_body["data"]["proposal"]["title"]).to eq(proposal.title)
|
|
end
|
|
|
|
specify "with raw query string inside body" do
|
|
graphql_headers = { "CONTENT_TYPE" => "application/graphql" }
|
|
post "/graphql", params: query_string,
|
|
headers: graphql_headers
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.parsed_body["data"]["proposal"]["title"]).to eq(proposal.title)
|
|
end
|
|
|
|
specify "with malformed query string" do
|
|
post "/graphql", params: { query: "Malformed query string" }.to_json, headers: json_headers
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.parsed_body["data"]).to be nil
|
|
expect(response.parsed_body["errors"]).to be_present
|
|
end
|
|
|
|
it "without query string" do
|
|
post "/graphql", headers: json_headers
|
|
|
|
expect(response).to have_http_status(:bad_request)
|
|
expect(response.parsed_body["message"]).to eq("Query string not present")
|
|
end
|
|
end
|
|
|
|
describe "correctly parses query variables" do
|
|
specify "when absent" do
|
|
get "/graphql", params: { query: query_string }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
end
|
|
|
|
specify "when specified as the 'null' string" do
|
|
get "/graphql", params: { query: query_string, variables: "null" }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
end
|
|
|
|
specify "when specified as an empty string" do
|
|
get "/graphql", params: { query: query_string, variables: "" }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
end
|
|
end
|
|
|
|
context "feature flag is set to false" do
|
|
before { Setting["feature.graphql_api"] = false }
|
|
|
|
it "is disabled" do
|
|
get "/graphql", params: { query: query_string }
|
|
|
|
expect(response).to have_http_status(:forbidden)
|
|
|
|
post "/graphql", params: { query: query_string }
|
|
|
|
expect(response).to have_http_status(:forbidden)
|
|
end
|
|
end
|
|
end
|