test/instrumentation/graphql_test.rb in instana-1.209.7 vs test/instrumentation/graphql_test.rb in instana-1.209.8
- old
+ new
@@ -6,112 +6,241 @@
class GraphqlTest < Minitest::Test
class TaskType < GraphQL::Schema::Object
field :id, ID, null: false
field :action, String, null: false
end
-
+
+ class JobType < GraphQL::Schema::Object
+ field :id, ID, null: false
+ field :name, String, null: false
+ field :description, String, null: false
+ end
+
+ class TaskJobUnion < GraphQL::Schema::Union
+ description "A union type for Task and Job"
+ possible_types TaskType, JobType
+
+ def self.resolve_type(object, _context)
+ if !object.action.nil?
+ TaskType
+ elsif !object.description?
+ JobType
+ else
+ raise("Unexpected object: #{object}")
+ end
+ end
+ end
+
class NewTaskType < GraphQL::Schema::Mutation
argument :action, String, required: true
field :task, TaskType, null: true
-
+
def resolve(action:)
{
task: OpenStruct.new(id: '0', action: action)
}
end
end
-
+
class QueryType < GraphQL::Schema::Object
field :tasks, TaskType.connection_type, null: false
-
+ field :jobs, JobType.connection_type, null: false
+ field :tasksorjobs, TaskJobUnion.connection_type, null: false
+
def tasks()
[
- OpenStruct.new(id: '0', action: 'Sample')
+ OpenStruct.new(id: '0', action: 'Sample 00'),
+ OpenStruct.new(id: '1', action: 'Sample 01'),
+ OpenStruct.new(id: '2', action: 'Sample 02'),
+ OpenStruct.new(id: '3', action: 'Sample 03'),
+ OpenStruct.new(id: '4', action: 'Sample 04')
]
end
+
+ def jobs()
+ [
+ OpenStruct.new(id: '0', name: 'Name 00', description: 'Desc 00'),
+ OpenStruct.new(id: '1', name: 'Name 01', description: 'Desc 01'),
+ OpenStruct.new(id: '2', name: 'Name 02', description: 'Desc 02'),
+ OpenStruct.new(id: '3', name: 'Name 03', description: 'Desc 03'),
+ OpenStruct.new(id: '4', name: 'Name 04', description: 'Desc 04')
+ ]
+ end
+
+ def tasksorjobs()
+ [
+ OpenStruct.new(id: '0', action: 'Task 00'),
+ OpenStruct.new(id: '0', name: 'Job 00', description: 'Job Desc 00')
+ ]
+ end
end
-
+
class MutationType < GraphQL::Schema::Object
field :create_task, mutation: NewTaskType
end
-
+
class Schema < GraphQL::Schema
query QueryType
mutation MutationType
end
-
+
def test_it_works
assert defined?(GraphQL)
end
-
- def test_config_defaults
+
+ def test_config_defaults
assert ::Instana.config[:graphql].is_a?(Hash)
assert ::Instana.config[:graphql].key?(:enabled)
assert_equal true, ::Instana.config[:graphql][:enabled]
end
-
+
def test_query
clear_all!
-
- query = "query Sample {
- tasks(after: \"\", first: 10) {
+
+ query = "query FirstTwoTaskSamples {
+ tasks(after: \"\", first: 2) {
nodes {
action
}
}
}"
-
+
expected_data = {
- :operationName => "Sample",
+ :operationName => "FirstTwoTaskSamples",
:operationType => "query",
:arguments => { "tasks" => ["after", "first"] },
:fields => { "tasks" => ["nodes"], "nodes" => ["action"] }
}
expected_results = {
"data" => {
- "tasks" => {
- "nodes" => [{ "action" => "Sample" }]
+ "tasks" => {
+ "nodes" => [{"action" => "Sample 00"}, {"action" => "Sample 01"}]
}
}
}
-
+
results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
query_span, root_span = *Instana.processor.queued_spans
-
+
assert_equal expected_results, results.to_h
assert_equal :sdk, root_span[:n]
assert_equal :'graphql.server', query_span[:n]
assert_equal expected_data, query_span[:data][:graphql]
end
-
+
+ def test_query_with_fragment
+ clear_all!
+
+ query = "
+ fragment actionDetails on Task {
+ action
+ }
+
+ query SampleWithFragment {
+ tasks {
+ nodes {
+ ... actionDetails
+ }
+ }
+ }"
+
+ expected_data = {
+ :operationName => "SampleWithFragment",
+ :operationType => "query",
+ :arguments => {},
+ :fields => { "tasks" => ["nodes"], "nodes" => ["actionDetails"] }
+ }
+ expected_results = {
+ "data" => {
+ "tasks" => {
+ "nodes" => [{"action" => "Sample 00"}, {"action" => "Sample 01"},
+ {"action" => "Sample 02"}, {"action" => "Sample 03"},
+ {"action" => "Sample 04"}]
+ }
+ }
+ }
+
+ results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
+ query_span, root_span = *Instana.processor.queued_spans
+
+ assert_equal expected_results, results.to_h
+ assert_equal :sdk, root_span[:n]
+ assert_equal :'graphql.server', query_span[:n]
+ assert_equal expected_data, query_span[:data][:graphql]
+ end
+
+ def test_query_union_with_fragment
+ clear_all!
+
+ query = "
+ query QueryUnionWithFragment {
+ tasksorjobs {
+ nodes {
+ ... on Task {
+ action
+ }
+ ... on Job {
+ name
+ description
+ }
+ }
+ }
+ }"
+
+ expected_data = {
+ :operationName => "QueryUnionWithFragment",
+ :operationType => "query",
+ :arguments => {},
+ :fields => { "tasksorjobs" => ["nodes"],
+ "nodes" => ["InlineFragment", "InlineFragment"],
+ "InlineFragment" => %w[action name description]}
+ }
+ expected_results = {
+ "data" => {
+ "tasksorjobs" => {
+ "nodes" => [{"action" => "Task 00"},
+ {"name" => "Job 00", "description" => "Job Desc 00"}]
+ }
+ }
+ }
+
+ results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
+ query_span, root_span = *Instana.processor.queued_spans
+
+ assert_equal expected_results, results.to_h
+ assert_equal :sdk, root_span[:n]
+ assert_equal :'graphql.server', query_span[:n]
+ assert_equal expected_data, query_span[:data][:graphql]
+ end
+
def test_mutation
clear_all!
-
+
query = "mutation Sample {
createTask(action: \"Sample\") {
task {
action
}
}
}"
-
+
expected_data = {
:operationName => "Sample",
:operationType => "mutation",
:arguments => { "createTask" => ["action"] },
:fields => { "createTask" => ["task"], "task" => ["action"] }
}
expected_results = {
"data" => {
- "createTask" => {
+ "createTask" => {
"task" => { "action" => "Sample" }
}
}
}
-
+
results = Instana.tracer.start_or_continue_trace('graphql-test') { Schema.execute(query) }
query_span, root_span = *Instana.processor.queued_spans
-
+
assert_equal expected_results, results.to_h
assert_equal :sdk, root_span[:n]
assert_equal :'graphql.server', query_span[:n]
assert_equal expected_data, query_span[:data][:graphql]
end