Last active
August 29, 2015 14:20
-
-
Save christhekeele/14d87e86f416e83a7d7b to your computer and use it in GitHub Desktop.
Test first_or_initialize behaviour with postgres_ext array types.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- 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