debian-mirror-gitlab/spec/lib/gitlab/graphql/tracers/logger_tracer_spec.rb
2022-01-26 12:08:38 +05:30

62 lines
2.1 KiB
Ruby

# frozen_string_literal: true
require "spec_helper"
RSpec.describe Gitlab::Graphql::Tracers::LoggerTracer do
let(:dummy_schema) do
Class.new(GraphQL::Schema) do
# LoggerTracer depends on TimerTracer
use Gitlab::Graphql::Tracers::LoggerTracer
use Gitlab::Graphql::Tracers::TimerTracer
query_analyzer Gitlab::Graphql::QueryAnalyzers::LoggerAnalyzer.new
query Graphql::FakeQueryType
end
end
around do |example|
Gitlab::ApplicationContext.with_context(caller_id: 'caller_a', feature_category: 'feature_a') do
example.run
end
end
it "logs every query", :aggregate_failures do
variables = { name: "Ada Lovelace" }
query_string = 'query fooOperation($name: String) { helloWorld(message: $name) }'
# Build an actual query so we don't have to hardocde the "fingerprint" calculations
query = GraphQL::Query.new(dummy_schema, query_string, variables: variables)
expect(::Gitlab::GraphqlLogger).to receive(:info).with({
"correlation_id" => anything,
"meta.caller_id" => "caller_a",
"meta.feature_category" => "feature_a",
"query_analysis.duration_s" => kind_of(Numeric),
"query_analysis.complexity" => 1,
"query_analysis.depth" => 1,
"query_analysis.used_deprecated_fields" => [],
"query_analysis.used_fields" => ["FakeQuery.helloWorld"],
duration_s: be > 0,
is_mutation: false,
operation_fingerprint: query.operation_fingerprint,
operation_name: 'fooOperation',
query_fingerprint: query.fingerprint,
query_string: query_string,
trace_type: "execute_query",
variables: variables.to_s
})
dummy_schema.execute(query_string, variables: variables)
end
it 'logs exceptions for breaking queries' do
query_string = "query fooOperation { breakingField }"
expect(::Gitlab::GraphqlLogger).to receive(:info).with(a_hash_including({
'exception.message' => 'This field is supposed to break',
'exception.class' => 'RuntimeError'
}))
expect { dummy_schema.execute(query_string) }.to raise_error(/This field is supposed to break/)
end
end