Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
graphql / spec / graphql / analysis / max_query_complexity_spec.rb
Size: Mime:
# frozen_string_literal: true
require "spec_helper"

describe GraphQL::Analysis::MaxQueryComplexity do
  before do
    @prev_max_complexity = Dummy::Schema.max_complexity
  end

  after do
    Dummy::Schema.max_complexity = @prev_max_complexity
  end


  let(:result) { Dummy::Schema.execute(query_string) }
  let(:query_string) {%|
    {
      a: cheese(id: 1) { id }
      b: cheese(id: 1) { id }
      c: cheese(id: 1) { id }
      d: cheese(id: 1) { id }
      e: cheese(id: 1) { id }
    }
  |}

  describe "when a query goes over max complexity" do
    before do
      Dummy::Schema.max_complexity = 9
    end

    it "returns an error" do
      assert_equal "Query has complexity of 10, which exceeds max complexity of 9", result["errors"][0]["message"]
    end
  end

  describe "when there is no max complexity" do
    before do
      Dummy::Schema.max_complexity = nil
    end
    it "doesn't error" do
      assert_nil result["errors"]
    end
  end

  describe "when the query is less than the max complexity" do
    before do
      Dummy::Schema.max_complexity = 99
    end
    it "doesn't error" do
      assert_nil result["errors"]
    end
  end

  describe "when max_complexity is decreased at query-level" do
    before do
      Dummy::Schema.max_complexity = 100
    end
    let(:result) { Dummy::Schema.execute(query_string, max_complexity: 7) }

    it "is applied" do
      assert_equal "Query has complexity of 10, which exceeds max complexity of 7", result["errors"][0]["message"]
    end
  end

  describe "when max_complexity is increased at query-level" do
    before do
      Dummy::Schema.max_complexity = 1
    end
    let(:result) { Dummy::Schema.execute(query_string, max_complexity: 10) }

    it "doesn't error" do
      assert_nil result["errors"]
    end
  end

  describe "across a multiplex" do
    before do
      Dummy::Schema.max_complexity = 9
    end

    let(:queries) { 5.times.map { |n|  { query: "{ cheese(id: #{n}) { id } }" } } }

    it "returns errors for all queries" do
      results = Dummy::Schema.multiplex(queries)
      assert_equal 5, results.length
      err_msg = "Query has complexity of 10, which exceeds max complexity of 9"
      results.each do |res|
        assert_equal err_msg, res["errors"][0]["message"]
      end
    end

    describe "with a local override" do
      it "uses the override" do
        results = Dummy::Schema.multiplex(queries, max_complexity: 10)
        assert_equal 5, results.length
        results.each do |res|
          assert_equal true, res.key?("data")
          assert_equal false, res.key?("errors")
        end
      end
    end
  end
end