diff --git a/.gitignore b/.gitignore index d87d4be..80036d4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ .config .yardoc Gemfile.lock +gemfiles/*.lock InstalledFiles _yardoc coverage diff --git a/Gemfile b/Gemfile index 5f10ba8..8364434 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,13 @@ # frozen_string_literal: true source 'https://rubygems.org' + gemspec + +# For default test setup with postgresql +# NOTE: If you want to run tests against MySQL do: +# docker compose --file docker-compose.mysql.yml up -d +# BUNDLE_GEMFILE=gemfiles/mysql.gemfile bundle install +# BUNDLE_GEMFILE=gemfiles/mysql.gemfile DB_ADAPTER=mysql bundle exec rake spec +# docker compose down +gem 'pg' diff --git a/README.md b/README.md index ab880e5..5417275 100644 --- a/README.md +++ b/README.md @@ -170,9 +170,20 @@ The tests require a database. We've provided a simple `docker-compose.yml` that it trivial to run the tests against PostgreSQL. Simply run `docker compose up -d` followed by `rake spec`. When you're done, run `docker compose down` to stop the database. -In order to use another database, simply define the `DATABASE_URL` environment variable +In order to use another PostgreSQL database, simply define the `DATABASE_URL` environment variable appropriately. +### Test against MySQL + +If you want to run tests against MySQL do: + +```shell +docker compose --file docker-compose.mysql.yml up -d +BUNDLE_GEMFILE=gemfiles/mysql.gemfile bundle install +BUNDLE_GEMFILE=gemfiles/mysql.gemfile DB_ADAPTER=mysql bundle exec rake spec +docker compose down +``` + ## License `ActiveRecord::JSONValidator` is © 2013-2022 [Mirego](https://www.mirego.com) and may be freely distributed under the [New BSD license](https://opensource.org/licenses/BSD-3-Clause). See the [`LICENSE.md`](https://github.com/mirego/activerecord_json_validator/blob/master/LICENSE.md) file. diff --git a/docker-compose.mysql.yml b/docker-compose.mysql.yml new file mode 100644 index 0000000..3c93d15 --- /dev/null +++ b/docker-compose.mysql.yml @@ -0,0 +1,10 @@ +version: '3.2' + +services: + mysql: + image: mysql:8.1 + ports: + - 3306:3306 + environment: + - MYSQL_ALLOW_EMPTY_PASSWORD=true + - MYSQL_DATABASE=activerecord_json_validator_test diff --git a/gemfiles/mysql.gemfile b/gemfiles/mysql.gemfile new file mode 100644 index 0000000..71d9004 --- /dev/null +++ b/gemfiles/mysql.gemfile @@ -0,0 +1,5 @@ +source 'https://rubygems.org' + +gemspec path: '../' + +gem 'mysql2', "~> 0.5.5" diff --git a/gemfiles/postgresql.gemfile b/gemfiles/postgresql.gemfile new file mode 100644 index 0000000..e86e028 --- /dev/null +++ b/gemfiles/postgresql.gemfile @@ -0,0 +1,5 @@ +source 'https://rubygems.org' + +gemspec path: '../' + +gem 'pg' diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 74fdeef..a27f740 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -4,7 +4,17 @@ require 'active_support/all' require 'rspec' -require 'pg' +require 'support/database/database_adapter' + +adapter = case ENV['DB_ADAPTER'] + when 'mysql' + require 'support/database/mysql_adapter' + 'mysql' + else + require 'pg' + require 'support/database/postgresql_adapter' + 'postgresql' + end require 'activerecord_json_validator' @@ -17,7 +27,6 @@ config.include ModelMacros config.before :each do - adapter = ENV['DB_ADAPTER'] || 'postgresql' setup_database(adapter: adapter, database: 'activerecord_json_validator_test') end end diff --git a/spec/support/database/database_adapter.rb b/spec/support/database/database_adapter.rb new file mode 100644 index 0000000..6ab7bc6 --- /dev/null +++ b/spec/support/database/database_adapter.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'active_record' +class DatabaseAdapter + attr_accessor :database + + def initialize(opts = {}) + self.database = opts[:database] + end + + def reset_database! + raise 'Define reset_database! in subclasses!' + end + + def establish_connection! + raise 'Define establish_connection! in subclasses!' + end +end diff --git a/spec/support/database/mysql_adapter.rb b/spec/support/database/mysql_adapter.rb new file mode 100644 index 0000000..f931e6d --- /dev/null +++ b/spec/support/database/mysql_adapter.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require_relative 'database_adapter' + +class MysqlAdapter < DatabaseAdapter + def reset_database! + ActiveRecord::Base.connection.execute("SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema = '#{database}';") + end + + def establish_connection! + ActiveRecord::Base.establish_connection( + ENV.fetch( + 'DATABASE_URL', + 'mysql2://root:@127.0.0.1:3306/activerecord_json_validator_test?pool=5' + ) + ) + end +end diff --git a/spec/support/macros/database/postgresql_adapter.rb b/spec/support/database/postgresql_adapter.rb similarity index 56% rename from spec/support/macros/database/postgresql_adapter.rb rename to spec/support/database/postgresql_adapter.rb index a99e344..0a5fb96 100644 --- a/spec/support/macros/database/postgresql_adapter.rb +++ b/spec/support/database/postgresql_adapter.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +require 'pg' require_relative 'database_adapter' class PostgresqlAdapter < DatabaseAdapter @@ -7,4 +8,13 @@ def reset_database! ActiveRecord::Base.connection.execute('drop schema public cascade;') ActiveRecord::Base.connection.execute('create schema public;') end + + def establish_connection! + ActiveRecord::Base.establish_connection( + ENV.fetch( + 'DATABASE_URL', + 'postgres://postgres@localhost/activerecord_json_validator_test' + ) + ) + end end diff --git a/spec/support/macros/database/database_adapter.rb b/spec/support/macros/database/database_adapter.rb deleted file mode 100644 index e1ceca0..0000000 --- a/spec/support/macros/database/database_adapter.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -class DatabaseAdapter - def initialize(opts = {}) - @database = opts[:database] - end - - def establish_connection! - ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL', 'postgres://postgres@localhost/activerecord_json_validator_test')) - end -end diff --git a/spec/support/macros/database/mysql_adapter.rb b/spec/support/macros/database/mysql_adapter.rb deleted file mode 100644 index ab7056e..0000000 --- a/spec/support/macros/database/mysql_adapter.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -require_relative 'database_adapter' - -class Mysql2Adapter < DatabaseAdapter - def reset_database! - ActiveRecord::Base.connection.execute("SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema = '#{@database}';") - end -end diff --git a/spec/support/macros/database_macros.rb b/spec/support/macros/database_macros.rb index ebe2cdf..2222dbf 100644 --- a/spec/support/macros/database_macros.rb +++ b/spec/support/macros/database_macros.rb @@ -20,7 +20,7 @@ def run_migration(&block) end def setup_database(opts = {}) - adapter = "#{opts[:adapter].capitalize}Adapter".constantize.new(database: opts[:database]) + adapter = "#{opts[:adapter].classify}Adapter".constantize.new(database: opts[:database]) adapter.establish_connection! adapter.reset_database!