Start using run_graphql_field in specific field tests

- Introduced `run_graphql_field` in tests that focus on resolving specific fields, leveraging the method added in GraphQL 2.2.0.
- Continued using `execute` for broader cases where it is still necessary to test entire GraphQL queries.
This commit is contained in:
taitus
2024-10-17 19:15:21 +02:00
parent e7f6e39679
commit 78d36dd563
4 changed files with 35 additions and 35 deletions

View File

@@ -5,18 +5,18 @@ describe Types::QueryType do
let(:proposal) { create(:proposal, author: user) }
it "returns fields of Int type" do
response = execute("{ proposal(id: #{proposal.id}) { cached_votes_up } }")
expect(dig(response, "data.proposal.cached_votes_up")).to eq(proposal.cached_votes_up)
response = run_graphql_field("Proposal.cached_votes_up", proposal)
expect(response).to eq(proposal.cached_votes_up)
end
it "returns fields of String type" do
response = execute("{ proposal(id: #{proposal.id}) { title } }")
expect(dig(response, "data.proposal.title")).to eq(proposal.title)
response = run_graphql_field("Proposal.title", proposal)
expect(response).to eq(proposal.title)
end
it "returns belongs_to associations" do
response = execute("{ proposal(id: #{proposal.id}) { public_author { username } } }")
expect(dig(response, "data.proposal.public_author.username")).to eq(proposal.public_author.username)
response = run_graphql_field("Proposal.public_author.username", proposal)
expect(response).to eq(proposal.public_author.username)
end
it "returns has_many associations" do
@@ -32,36 +32,46 @@ describe Types::QueryType do
end
it "hides confidential fields of Int type" do
response = execute("{ user(id: #{user.id}) { failed_census_calls_count } }")
expect(hidden_field?(response, "failed_census_calls_count")).to be_truthy
expect do
run_graphql_field("User.failed_census_calls_count", user)
end.to raise_error GraphQL::Testing::Helpers::FieldNotDefinedError
end
it "hides confidential fields of String type" do
response = execute("{ user(id: #{user.id}) { encrypted_password } }")
expect(hidden_field?(response, "encrypted_password")).to be_truthy
expect do
run_graphql_field("User.encrypted_password", user)
end.to raise_error GraphQL::Testing::Helpers::FieldNotDefinedError
end
it "hides confidential has_one associations" do
user.administrator = create(:administrator)
response = execute("{ user(id: #{user.id}) { administrator { id } } }")
expect(hidden_field?(response, "administrator")).to be_truthy
expect do
run_graphql_field("User.administrator.id", user)
end.to raise_error GraphQL::Testing::Helpers::FieldNotDefinedError, /no field named `administrator`/
end
it "hides confidential belongs_to associations" do
create(:failed_census_call, user: user)
response = execute("{ user(id: #{user.id}) { failed_census_calls { id } } }")
expect(hidden_field?(response, "failed_census_calls")).to be_truthy
expect do
run_graphql_field("User.failed_census_calls.id", user)
end.to raise_error GraphQL::Testing::Helpers::FieldNotDefinedError, /no field named `failed_census_calls`/
end
it "hides confidential has_many associations" do
create(:direct_message, sender: user)
response = execute("{ user(id: #{user.id}) { direct_messages_sent { id } } }")
expect(hidden_field?(response, "direct_messages_sent")).to be_truthy
expect do
run_graphql_field("User.direct_messages_sent.id", user)
end.to raise_error GraphQL::Testing::Helpers::FieldNotDefinedError,
/no field named `direct_messages_sent`/
end
it "hides confidential fields inside deeply nested queries" do
response = execute("{ proposals(first: 1) { edges { node { public_author { encrypted_password } } } } }")
expect(hidden_field?(response, "encrypted_password")).to be_truthy
expect do
run_graphql_field("Proposal.public_author.encrypted_password", proposal)
end.to raise_error GraphQL::Testing::Helpers::FieldNotDefinedError, /no field named `encrypted_password`/
end
describe "#comments" do

View File

@@ -7,28 +7,25 @@ describe Types::UserType do
it "does not link debates" do
create(:debate, author: user)
response = execute("{ user(id: #{user.id}) { public_debates { edges { node { title } } } } }")
received_debates = dig(response, "data.user.public_debates.edges")
response = run_graphql_field("User.public_debates", user)
expect(received_debates).to eq []
expect(response.items).to eq []
end
it "does not link proposals" do
create(:proposal, author: user)
response = execute("{ user(id: #{user.id}) { public_proposals { edges { node { title } } } } }")
received_proposals = dig(response, "data.user.public_proposals.edges")
response = run_graphql_field("User.public_proposals", user)
expect(received_proposals).to eq []
expect(response.items).to eq []
end
it "does not link comments" do
create(:comment, author: user)
response = execute("{ user(id: #{user.id}) { public_comments { edges { node { body } } } } }")
received_comments = dig(response, "data.user.public_comments.edges")
response = run_graphql_field("User.public_comments", user)
expect(received_comments).to eq []
expect(response.items).to eq []
end
end

View File

@@ -21,6 +21,7 @@ RSpec.configure do |config|
config.include(EmailSpec::Matchers)
config.include(CommonActions)
config.include(ActiveSupport::Testing::TimeHelpers)
config.include GraphQL::Testing::Helpers.for(ConsulSchema)
config.define_derived_metadata(file_path: Regexp.new("/spec/components/")) do |metadata|
metadata[:type] = :component

View File

@@ -7,14 +7,6 @@ module GraphQLAPI
response.dig(*path.split("."))
end
def hidden_field?(response, field_name)
data_is_empty = response["data"].nil?
error_message = /Field '#{field_name}' doesn't exist on type '[[:alnum:]]*'/
error_is_present = ((response["errors"].first["message"] =~ error_message) == 0)
data_is_empty && error_is_present
end
def extract_fields(response, collection_name, field_chain)
fields = field_chain.split(".")
dig(response, "data.#{collection_name}.edges").map do |node|