Skip to content

Instantly share code, notes, and snippets.

@christhekeele
Last active August 29, 2015 14:20
Show Gist options
  • Select an option

  • Save christhekeele/14d87e86f416e83a7d7b to your computer and use it in GitHub Desktop.

Select an option

Save christhekeele/14d87e86f416e83a7d7b to your computer and use it in GitHub Desktop.
Test first_or_initialize behaviour with postgres_ext array types.
require 'active_record'
require 'postgres_ext'
require 'minitest/autorun'
require 'logger'
# DB created on localhost with `createdb first_or_initialize`
ActiveRecord::Base.establish_connection('postgres://localhost/first_or_initialize')
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Schema.define do
create_table :posts, force: true do |t|
t.string :tags, array: true, default: []
end
end
class Post < ActiveRecord::Base
end
class BugTest < Minitest::Test
def test_first_or_initialize_new_overlap
assert_equal overlap_tags(['new_overlap']).tags, ['new_overlap']
end
def test_first_or_initialize_existing_overlap
overlap_tags(['existing_overlap']).save
assert_equal overlap_tags(['existing_overlap']).tags, ['existing_overlap']
end
def test_first_or_initialize_new_contains
assert_equal contains_tags(['new_contains']).tags, ['new_contains']
end
def test_first_or_initialize_existing_contains
contains_tags(['existing_contains']).save
assert_equal contains_tags(['existing_contains']).tags, ['existing_contains']
end
def test_first_or_initialize_new_any
assert_equal any_tag('new_any').tags, ['new_any']
end
def test_first_or_initialize_existing_any
any_tag('existing_any').save
assert_equal any_tag('existing_any').tags, ['existing_any']
end
def test_first_or_initialize_new_all
assert_equal all_tag('new_all').tags, ['new_all']
end
def test_first_or_initialize_existing_all
all_tag('existing_all').save
assert_equal all_tag('existing_all').tags, ['existing_all']
end
private
def overlap_tags(tags)
Post.where.overlap(tags: tags).first_or_initialize
end
def contains_tags(tags)
Post.where.contains(tags: tags).first_or_initialize
end
def any_tag(tag)
Post.where.any(tags: tag).first_or_initialize
end
def all_tag(tag)
Post.where.all(tags: tag).first_or_initialize
end
end
-- create_table(:posts, {:force=>true})
D, [2015-04-26T18:49:06.988630 #33669] DEBUG -- : (2.4ms) DROP TABLE "posts"
D, [2015-04-26T18:49:06.993108 #33669] DEBUG -- : (3.7ms) CREATE TABLE "posts" ("id" serial primary key, "tags" character varying[] DEFAULT '{}')
-> 0.0282s
Run options: --seed 47659
# Running:
D, [2015-04-26T18:49:07.243796 #33669] DEBUG -- : Post Load (1.2ms) SELECT "posts".* FROM "posts" WHERE ("posts"."tags" && '{new_overlap}') ORDER BY "posts"."id" ASC LIMIT 1
FD, [2015-04-26T18:49:07.247922 #33669] DEBUG -- : Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE $1 = ALL("posts"."tags") ORDER BY "posts"."id" ASC LIMIT 1 [["tags", "new_all"]]
ED, [2015-04-26T18:49:07.248646 #33669] DEBUG -- : Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE $1 = ALL("posts"."tags") ORDER BY "posts"."id" ASC LIMIT 1 [["tags", "existing_all"]]
ED, [2015-04-26T18:49:07.249504 #33669] DEBUG -- : Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE $1 = ANY("posts"."tags") ORDER BY "posts"."id" ASC LIMIT 1 [["tags", "new_any"]]
ED, [2015-04-26T18:49:07.250295 #33669] DEBUG -- : Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE ("posts"."tags" @> '{existing_contains}') ORDER BY "posts"."id" ASC LIMIT 1
D, [2015-04-26T18:49:07.250655 #33669] DEBUG -- : (0.1ms) BEGIN
D, [2015-04-26T18:49:07.252710 #33669] DEBUG -- : SQL (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2015-04-26T18:49:07.253450 #33669] DEBUG -- : (0.4ms) COMMIT
D, [2015-04-26T18:49:07.254200 #33669] DEBUG -- : Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE ("posts"."tags" @> '{existing_contains}') ORDER BY "posts"."id" ASC LIMIT 1
FD, [2015-04-26T18:49:07.254955 #33669] DEBUG -- : Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE ("posts"."tags" @> '{new_contains}') ORDER BY "posts"."id" ASC LIMIT 1
FD, [2015-04-26T18:49:07.255634 #33669] DEBUG -- : Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE ("posts"."tags" && '{existing_overlap}') ORDER BY "posts"."id" ASC LIMIT 1
D, [2015-04-26T18:49:07.255943 #33669] DEBUG -- : (0.1ms) BEGIN
D, [2015-04-26T18:49:07.256407 #33669] DEBUG -- : SQL (0.2ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2015-04-26T18:49:07.256914 #33669] DEBUG -- : (0.3ms) COMMIT
D, [2015-04-26T18:49:07.257486 #33669] DEBUG -- : Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE ("posts"."tags" && '{existing_overlap}') ORDER BY "posts"."id" ASC LIMIT 1
FD, [2015-04-26T18:49:07.258126 #33669] DEBUG -- : Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE $1 = ANY("posts"."tags") ORDER BY "posts"."id" ASC LIMIT 1 [["tags", "existing_any"]]
E
Finished in 0.023713s, 337.3677 runs/s, 168.6838 assertions/s.
1) Failure:
BugTest#test_first_or_initialize_new_overlap [first_or_initialize_pg_array.rb:22]:
Expected: []
Actual: ["new_overlap"]
2) Error:
BugTest#test_first_or_initialize_new_all:
NoMethodError: undefined method `relation' for #<Arel::Nodes::BindParam:0x007f84f624a748>
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:561:in `block in where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `each'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `find_all'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:579:in `scope_for_create'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping/named.rb:39:in `scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:25:in `populate_with_current_scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:32:in `initialize_internals_callback'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/core.rb:277:in `initialize'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `block in new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:302:in `scoping'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:163:in `first_or_initialize'
first_or_initialize_pg_array.rb:72:in `all_tag'
first_or_initialize_pg_array.rb:49:in `test_first_or_initialize_new_all'
3) Error:
BugTest#test_first_or_initialize_existing_all:
NoMethodError: undefined method `relation' for #<Arel::Nodes::BindParam:0x007f84f62448c0>
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:561:in `block in where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `each'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `find_all'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:579:in `scope_for_create'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping/named.rb:39:in `scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:25:in `populate_with_current_scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:32:in `initialize_internals_callback'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/core.rb:277:in `initialize'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `block in new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:302:in `scoping'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:163:in `first_or_initialize'
first_or_initialize_pg_array.rb:72:in `all_tag'
first_or_initialize_pg_array.rb:53:in `test_first_or_initialize_existing_all'
4) Error:
BugTest#test_first_or_initialize_new_any:
NoMethodError: undefined method `relation' for #<Arel::Nodes::BindParam:0x007f84f627b820>
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:561:in `block in where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `each'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `find_all'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:579:in `scope_for_create'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping/named.rb:39:in `scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:25:in `populate_with_current_scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:32:in `initialize_internals_callback'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/core.rb:277:in `initialize'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `block in new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:302:in `scoping'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:163:in `first_or_initialize'
first_or_initialize_pg_array.rb:68:in `any_tag'
first_or_initialize_pg_array.rb:40:in `test_first_or_initialize_new_any'
5) Failure:
BugTest#test_first_or_initialize_existing_contains [first_or_initialize_pg_array.rb:36]:
Expected: []
Actual: ["existing_contains"]
6) Failure:
BugTest#test_first_or_initialize_new_contains [first_or_initialize_pg_array.rb:31]:
Expected: []
Actual: ["new_contains"]
7) Failure:
BugTest#test_first_or_initialize_existing_overlap [first_or_initialize_pg_array.rb:27]:
Expected: []
Actual: ["existing_overlap"]
8) Error:
BugTest#test_first_or_initialize_existing_any:
NoMethodError: undefined method `relation' for #<Arel::Nodes::BindParam:0x007f84f51ee688>
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:561:in `block in where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `each'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `find_all'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:560:in `where_values_hash'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:579:in `scope_for_create'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping/named.rb:39:in `scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:25:in `populate_with_current_scope_attributes'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/scoping.rb:32:in `initialize_internals_callback'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/core.rb:277:in `initialize'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/inheritance.rb:61:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `block in new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:302:in `scoping'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:120:in `new'
/usr/local/var/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/relation.rb:163:in `first_or_initialize'
first_or_initialize_pg_array.rb:68:in `any_tag'
first_or_initialize_pg_array.rb:44:in `test_first_or_initialize_existing_any'
8 runs, 4 assertions, 4 failures, 4 errors, 0 skips
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment