# Query-count instrumentation for SimplyBased. The Store appends each KV op and # N1QL statement to $performed_queries (see SimplyBased::Store#_instrument), so # these matchers measure database round-trips without touching any driver. # # NOTE: absolute query counts differ from the CouchDB original — Couchbase # resolves multi-id loads as individual KV gets rather than one _bulk_docs call, # so specs asserting exact CouchDB counts are tagged :couchdb_counts. $performed_queries = [] RSpec::Matchers.define :exceed_query_limit do |expected| match do |block| query_count(&block) > expected end failure_message_when_negated do |actual| "Expected to run maximum #{expected} queries, got #{@executed_queries}\n" \ "queries:\n - #{$performed_queries.map { |q| q[:url] }.join("\n - ")}" end def query_count(&block) $performed_queries = [] block.call @executed_queries = $performed_queries.size end def supports_block_expectations? true end end RSpec::Matchers.define :perform_any_queries do |expected| match do |block| query_count(&block) > 0 end failure_message_when_negated do |actual| "Expected to run no queries, got #{@executed_queries}\n" \ "Extra queries:\n - #{$performed_queries.map { |q| q[:url] }.join("\n - ")}" end def query_count(&block) $performed_queries = [] block.call @executed_queries = $performed_queries.size end def supports_block_expectations? true end end