Added tests for where_properties
Andrew Kane
committed Jun 21, 2016
commit ee10c5a79111450ec00c80c8623b85e0a38d2691
Showing 8
changed files with
130 additions
and 17 deletions
ahoy_matey.gemspec
+3
-0
| @@ | @@ -32,4 +32,7 @@ Gem::Specification.new do |spec| |
| spec.add_development_dependency "bundler", "~> 1.5" | |
| spec.add_development_dependency "rake" | |
| spec.add_development_dependency "minitest" | |
| + | spec.add_development_dependency "activerecord" |
| + | spec.add_development_dependency "pg" |
| + | spec.add_development_dependency "mysql2" |
| end | |
ahoy.rb b/lib/ahoy.rb
+17
-14
| @@ | @@ -1,3 +1,4 @@ |
| + | require "active_support" |
| require "active_support/core_ext" | |
| require "addressable/uri" | |
| require "browser" | |
| @@ | @@ -28,7 +29,7 @@ require "ahoy/stores/mongoid_store" |
| require "ahoy/stores/kafka_store" | |
| require "ahoy/stores/kinesis_firehose_store" | |
| require "ahoy/stores/bunny_store" | |
| - | require "ahoy/engine" |
| + | require "ahoy/engine" if defined?(Rails) |
| require "ahoy/warden" if defined?(Warden) | |
| # background jobs | |
| @@ | @@ -106,19 +107,21 @@ module Ahoy |
| self.track_bots = false | |
| end | |
| - | ActionController::Base.send :include, Ahoy::Controller |
| - | ActiveRecord::Base.send(:extend, Ahoy::Model) if defined?(ActiveRecord) |
| - | |
| - | # ensure logger silence will not be added by activerecord-session_store |
| - | # otherwise, we get SystemStackError: stack level too deep |
| - | begin |
| - | require "active_record/session_store/extension/logger_silencer" |
| - | rescue LoadError |
| - | require "ahoy/logger_silencer" |
| - | Logger.send :include, Ahoy::LoggerSilencer |
| + | if defined?(Rails) |
| + | ActionController::Base.send :include, Ahoy::Controller |
| + | ActiveRecord::Base.send(:extend, Ahoy::Model) if defined?(ActiveRecord) |
| + | # ensure logger silence will not be added by activerecord-session_store |
| + | # otherwise, we get SystemStackError: stack level too deep |
| begin | |
| - | require "syslog/logger" |
| - | Syslog::Logger.send :include, Ahoy::LoggerSilencer |
| - | rescue LoadError; end |
| + | require "active_record/session_store/extension/logger_silencer" |
| + | rescue LoadError |
| + | require "ahoy/logger_silencer" |
| + | Logger.send :include, Ahoy::LoggerSilencer |
| + | |
| + | begin |
| + | require "syslog/logger" |
| + | Syslog::Logger.send :include, Ahoy::LoggerSilencer |
| + | rescue LoadError; end |
| + | end |
| end | |
ahoy/properties.rb b/lib/ahoy/properties.rb
+3
-3
| @@ | @@ -9,18 +9,18 @@ module Ahoy |
| case column_type | |
| when :jsonb, :json | |
| properties.each do |k, v| | |
| - | relation = relation.where("properties ->> ? = ?", k, v) |
| + | relation = relation.where("properties ->> ? = ?", k.to_s, v.to_s) |
| end | |
| else | |
| adapter_name = connection.adapter_name.downcase | |
| case adapter_name | |
| when /postgres/ | |
| properties.each do |k, v| | |
| - | relation = relation.where("properties SIMILAR TO ?", "%[{,]#{{k => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "")}[,}]%") |
| + | relation = relation.where("properties SIMILAR TO ?", "%[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "")}[,}]%") |
| end | |
| when /mysql/ | |
| properties.each do |k, v| | |
| - | relation = relation.where("properties REGEXP ?", "[{,]#{{k => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "")}[,}]") |
| + | relation = relation.where("properties REGEXP ?", "[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "")}[,}]") |
| end | |
| else | |
| raise "Adapter not supported: #{adapter_name}" | |
test/properties/mysql_text_test.rb
+21
-0
| @@ | @@ -0,0 +1,21 @@ |
| + | require_relative "../test_helper" |
| + | |
| + | ActiveRecord::Base.establish_connection adapter: "mysql2", username: "root", database: "ahoy_test" |
| + | |
| + | ActiveRecord::Migration.create_table :ahoy_events, force: true do |t| |
| + | t.text :properties |
| + | end |
| + | |
| + | Ahoy.send(:remove_const, :Event) if defined?(Ahoy::Event) |
| + | |
| + | class Ahoy::Event < ActiveRecord::Base |
| + | include Ahoy::Properties |
| + | |
| + | self.table_name = "ahoy_events" |
| + | |
| + | serialize :properties, JSON |
| + | end |
| + | |
| + | class MysqlTextTest < Minitest::Test |
| + | include PropertiesTest |
| + | end |
test/properties/postgresql_json_test.rb
+19
-0
| @@ | @@ -0,0 +1,19 @@ |
| + | require_relative "../test_helper" |
| + | |
| + | ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test" |
| + | |
| + | ActiveRecord::Migration.create_table :ahoy_events, force: true do |t| |
| + | t.json :properties |
| + | end |
| + | |
| + | Ahoy.send(:remove_const, :Event) if defined?(Ahoy::Event) |
| + | |
| + | class Ahoy::Event < ActiveRecord::Base |
| + | include Ahoy::Properties |
| + | |
| + | self.table_name = "ahoy_events" |
| + | end |
| + | |
| + | class PostgresqlJsonTest < Minitest::Test |
| + | include PropertiesTest |
| + | end |
test/properties/postgresql_jsonb_test.rb
+19
-0
| @@ | @@ -0,0 +1,19 @@ |
| + | require_relative "../test_helper" |
| + | |
| + | ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test" |
| + | |
| + | ActiveRecord::Migration.create_table :ahoy_events, force: true do |t| |
| + | t.jsonb :properties |
| + | end |
| + | |
| + | Ahoy.send(:remove_const, :Event) if defined?(Ahoy::Event) |
| + | |
| + | class Ahoy::Event < ActiveRecord::Base |
| + | include Ahoy::Properties |
| + | |
| + | self.table_name = "ahoy_events" |
| + | end |
| + | |
| + | class PostgresqlJsonbTest < Minitest::Test |
| + | include PropertiesTest |
| + | end |
test/properties/postgresql_text_test.rb
+21
-0
| @@ | @@ -0,0 +1,21 @@ |
| + | require_relative "../test_helper" |
| + | |
| + | ActiveRecord::Base.establish_connection adapter: "postgresql", database: "ahoy_test" |
| + | |
| + | ActiveRecord::Migration.create_table :ahoy_events, force: true do |t| |
| + | t.text :properties |
| + | end |
| + | |
| + | Ahoy.send(:remove_const, :Event) if defined?(Ahoy::Event) |
| + | |
| + | class Ahoy::Event < ActiveRecord::Base |
| + | include Ahoy::Properties |
| + | |
| + | self.table_name = "ahoy_events" |
| + | |
| + | serialize :properties, JSON |
| + | end |
| + | |
| + | class PostgresqlTextTest < Minitest::Test |
| + | include PropertiesTest |
| + | end |
test/test_helper.rb
+27
-0
| @@ | @@ -2,3 +2,30 @@ require "bundler/setup" |
| Bundler.require(:default) | |
| require "minitest/autorun" | |
| require "minitest/pride" | |
| + | require "active_record" |
| + | |
| + | ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT) if ENV["VERBOSE"] |
| + | |
| + | module PropertiesTest |
| + | def setup |
| + | Ahoy::Event.delete_all |
| + | end |
| + | |
| + | def test_empty |
| + | assert_equal 0, Ahoy::Event.where_properties({}).count |
| + | end |
| + | |
| + | def test_string |
| + | create_event hello: "world" |
| + | assert_equal 1, Ahoy::Event.where_properties(hello: "world").count |
| + | end |
| + | |
| + | def test_number |
| + | create_event product_id: 1 |
| + | assert_equal 1, Ahoy::Event.where_properties(product_id: 1).count |
| + | end |
| + | |
| + | def create_event(properties) |
| + | Ahoy::Event.create(properties: properties) |
| + | end |
| + | end |