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