Module: AppQuery::RSpec::Helpers

Defined in:
lib/app_query/rspec/helpers.rb

Overview

RSpec helpers for testing query classes.

Examples:

Basic usage

RSpec.describe ProductsQuery, type: :query do
  it "returns products" do
    expect(described_query.entries).to be_present
  end
end

Testing a specific CTE

RSpec.describe ProductsQuery, type: :query do
  describe "cte active_products" do
    it "only contains active products" do
      expect(described_query.entries).to all(include("active" => true))
    end
  end
end

With required binds

RSpec.describe UsersQuery, type: :query, binds: {company_id: 1} do
  it "returns users for company" do
    expect(described_query.entries).to be_present
  end
end

With vars

RSpec.describe ProductsQuery, type: :query do
  describe "as admin", vars: {admin: true} do
    it "returns all products" do
      expect(described_query.count).to eq(3)
    end
  end
end

SQL logging for debugging

RSpec.describe ProductsQuery, type: :query do
  describe "debugging", log: true do
    it "logs SQL to stdout" do
      # SQL queries will be printed to the console
      described_query.entries
    end
  end
end

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#build_query(**kwargs) ⇒ AppQuery::BaseQuery

Builds the query instance. Override this to customize instantiation.

Examples:

Custom build method

def build_query(**kwargs)
  described_class.build(**query_binds.merge(query_vars).merge(kwargs))
end

Parameters:

Returns:



73
74
75
# File 'lib/app_query/rspec/helpers.rb', line 73

def build_query(**kwargs)
  described_class.new(**query_binds.merge(query_vars).merge(kwargs))
end

#cte_nameString?

Returns the CTE name if inside a "cte xxx" describe block.

Returns:

  • (String, nil)

    the CTE name



94
95
96
# File 'lib/app_query/rspec/helpers.rb', line 94

def cte_name
  self.class.cte_name
end

#described_query(**kwargs) ⇒ AppQuery::BaseQuery, AppQuery::Q

Returns the query instance, optionally focused on a CTE.

When inside a describe "cte xxx" block, returns a query that selects from that CTE instead of the full query.

Examples:

Override binds per-test

expect(described_query(user_id: 123).entries).to include(...)

Parameters:

Returns:



59
60
61
62
# File 'lib/app_query/rspec/helpers.rb', line 59

def described_query(**kwargs)
  query = build_query(**kwargs)
  cte_name ? query.query.cte(cte_name) : query
end

#query_bindsHash

Returns binds from RSpec metadata.

Returns:

  • (Hash)

    the binds hash



80
81
82
# File 'lib/app_query/rspec/helpers.rb', line 80

def query_binds
  (:binds) || {}
end

#query_varsHash

Returns vars from RSpec metadata.

Returns:

  • (Hash)

    the vars hash



87
88
89
# File 'lib/app_query/rspec/helpers.rb', line 87

def query_vars
  (:vars) || {}
end