require 'pact_broker/matrix/repository' module PactBroker module Matrix describe Repository do # See https://github.com/pact-foundation/pact_broker-client/issues/53 # The problem occurs when a pact has so many verifications for the same provider # version that relevant rows do get returned in the result set because the specified limit # causes them to be truncated. # The most elegant solution is to create views have the data already grouped by # consumer version/provider version, consumer version/provider, and consumer/provider, # however, I don't have the time to work out how to make that view query efficient - I suspect # it will require lots of full table scans, as it will have to work out the latest pact revision # and latest verification for each pact publication and I'm not sure if it will have to do it # for the entire table, or whether it will apply the consumer/provider filters... # The quick and dirty solution is to do a pre-query to get the latest pact revision and latest # verifications for the pact versions before we do the matrix query. describe "querying for can-i-deploy when there are more matrix rows than the specified query limit" do before do td.create_consumer("Foo") .create_provider("Bar") .create_consumer_version("1") .create_pact .create_verification(number: 1, provider_version: "2", tag_names: ['staging']) .create_verification(number: 2, provider_version: "2") .create_verification(number: 3, provider_version: "2") .create_verification(number: 4, provider_version: "2") .create_verification(number: 5, provider_version: "3") .create_provider("Wiffle") .create_pact .create_verification(number: 1, provider_version: "6", tag_names: ['staging']) end let(:path) { "/matrix?q[][pacticipant]=Foo&q[][version]=1&tag=staging&latestby=cvp&limit=2" } subject { get(path) } it "does not remove relevant rows from the query due to the specified limit" do expect(JSON.parse(subject.body)['summary']['deployable']).to be true end end describe "querying for the UI when there is a bi-directional pact and there are more matrix rows for one direction than the specified query limit" do before do td.create_pact_with_verification("Foo", "1", "Bar", "2") .create_pact_with_verification("Bar", "2", "Foo", "1") .add_day .create_pact_with_verification("Foo", "3", "Bar", "4") .create_pact_with_verification("Bar", "4", "Foo", "3") .add_day .create_pact_with_verification("Foo", "5", "Bar", "6") .create_pact_with_verification("Bar", "6", "Foo", "5") end let(:selectors) do [ UnresolvedSelector.new(pacticipant_name: 'Foo'), UnresolvedSelector.new(pacticipant_name: 'Bar') ] end let(:options) { { limit: 4 } } subject { Repository.new.find(selectors, options) } it "includes rows from each direction" do expect(subject.count{ |r| r.consumer_name == 'Foo' }).to eq (subject.count{ |r| r.consumer_name == 'Bar' }) end context "when where is a latestby" do let(:options) { { limit: 4, latestby: 'cvpv'} } it "includes rows from each direction" do expect(subject.count{ |r| r.consumer_name == 'Foo' }).to eq (subject.count{ |r| r.consumer_name == 'Bar' }) end end end end end end