spec/pgrel/jsonb_spec.rb in pgrel-0.2.0 vs spec/pgrel/jsonb_spec.rb in pgrel-0.3.0

- old
+ new

@@ -1,9 +1,9 @@ require 'spec_helper' describe Jsonb do - before do + before(:all) do @connection = ActiveRecord::Base.connection @connection.transaction do @connection.create_table('jsonbs') do |t| t.jsonb 'tags', default: {}, null: false @@ -12,11 +12,13 @@ end Jsonb.reset_column_information end - after do + after { Jsonb.delete_all } + + after(:all) do @connection.drop_table 'jsonbs', if_exists: true end let!(:setup) do Jsonb.create!(name: 'a') @@ -106,27 +108,34 @@ records = Jsonb.where.store(:tags).keys([:b, :c]) expect(records.size).to eq 1 expect(records.first.name).to eq 'e' end - it '#value' do - records = Jsonb.where.store(:tags).value(1, false, { e: 2 }) - expect(records.size).to eq 3 + describe '#overlap_values' do + let(:records) { Jsonb.where.store(:tags).overlap_values(1, false, { e: 2 }) } + + it 'returns records with overlapping values' do + expect(records.size).to eq 3 + end + + it 'calls array_agg function only once' do + expect(records.to_sql.scan(/array_agg/).count).to eq 1 + end end - it '#values' do - records = Jsonb.where.store(:tags).values(1) + it '#contains_values' do + records = Jsonb.where.store(:tags).contains_values(1) expect(records.size).to eq 2 - records = Jsonb.where.store(:tags).values(2, 'e') + records = Jsonb.where.store(:tags).contains_values(2, 'e') expect(records.size).to eq 1 expect(records.first.name).to eq 'e' - records = Jsonb.where.store(:tags).values(e: 1, f: { h: { k: 'a', s: 2 } }) + records = Jsonb.where.store(:tags).contains_values(e: 1, f: { h: { k: 'a', s: 2 } }) expect(records.size).to eq 1 - records = Jsonb.where.store(:tags).values(false, { a: 1, b: '1' }, [1, '1']) + records = Jsonb.where.store(:tags).contains_values(false, { a: 1, b: '1' }, [1, '1']) expect(records.size).to eq 1 end it '#any' do records = Jsonb.where.store(:tags).any('a', 'b') @@ -197,8 +206,34 @@ it "#delete_pairs" do subject.delete_pairs(a: 1, d: { e: 2 }) expect(Jsonb.where.store(store, a: 1)).to_not exist expect(Jsonb.where.store(store, d: { e: 2 })).to_not exist + end + end + + context "joins" do + before do + User.create!(name: "x", jsonb: Jsonb.find_by!(name: "a")) + User.create!(name: "y", jsonb: Jsonb.find_by!(name: "b")) + User.create!(name: "z", jsonb: Jsonb.find_by!(name: "c")) + end + + it "works" do + users = User.joins(:jsonb).merge(Jsonb.where.store(:tags).key(:a)) + expect(users.size).to eq 2 + expect(users.map(&:name)).to match_array(["y", "z"]) + end + + it "works with #path" do + users = User.joins(:jsonb).merge(Jsonb.where.store(:tags).path(:a, 2)) + expect(users.size).to eq 1 + expect(users.map(&:name)).to match_array(["z"]) + end + + it "works with #contains_values" do + users = User.joins(:jsonb).merge(Jsonb.where.store(:tags).contains_values(1)) + expect(users.size).to eq 1 + expect(users.map(&:name)).to match_array(["y"]) end end end