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