Skip to content

Commit 04fc02c

Browse files
committed
🎨 Modernize test harness
1 parent 810a11a commit 04fc02c

13 files changed

+100
-24
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
.config
55
.yardoc
66
Gemfile.lock
7+
gemfiles/*.lock
78
InstalledFiles
89
_yardoc
910
coverage

Gemfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
# frozen_string_literal: true
22

33
source 'https://rubygems.org'
4+
45
gemspec
6+
7+
# For default test setup with postgresql
8+
# NOTE: If you want to run tests against MySQL do:
9+
# docker compose --file docker-compose.mysql.yml up -d
10+
# BUNDLE_GEMFILE=gemfiles/mysql.gemfile bundle install
11+
# BUNDLE_GEMFILE=gemfiles/mysql.gemfile DB_ADAPTER=mysql bundle exec rake spec
12+
# docker compose down
13+
gem 'pg'

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,20 @@ The tests require a database. We've provided a simple `docker-compose.yml` that
170170
it trivial to run the tests against PostgreSQL. Simply run `docker compose up -d`
171171
followed by `rake spec`. When you're done, run `docker compose down` to stop the database.
172172

173-
In order to use another database, simply define the `DATABASE_URL` environment variable
173+
In order to use another PostgreSQL database, simply define the `DATABASE_URL` environment variable
174174
appropriately.
175175

176+
### Test against MySQL
177+
178+
If you want to run tests against MySQL do:
179+
180+
```shell
181+
docker compose --file docker-compose.mysql.yml up -d
182+
BUNDLE_GEMFILE=gemfiles/mysql.gemfile bundle install
183+
BUNDLE_GEMFILE=gemfiles/mysql.gemfile DB_ADAPTER=mysql bundle exec rake spec
184+
docker compose down
185+
```
186+
176187
## License
177188

178189
`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.

docker-compose.mysql.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
version: '3.2'
2+
3+
services:
4+
mysql:
5+
image: mysql:8.1
6+
ports:
7+
- 3306:3306
8+
environment:
9+
- MYSQL_ALLOW_EMPTY_PASSWORD=true
10+
- MYSQL_DATABASE=activerecord_json_validator_test

gemfiles/mysql.gemfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
source 'https://rubygems.org'
2+
3+
gemspec path: '../'
4+
5+
gem 'mysql2', "~> 0.5.5"

gemfiles/postgresql.gemfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
source 'https://rubygems.org'
2+
3+
gemspec path: '../'
4+
5+
gem 'pg'

spec/spec_helper.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,17 @@
44

55
require 'active_support/all'
66
require 'rspec'
7-
require 'pg'
7+
require 'support/database/database_adapter'
8+
9+
adapter = case ENV['DB_ADAPTER']
10+
when 'mysql'
11+
require 'support/database/mysql_adapter'
12+
'mysql'
13+
else
14+
require 'pg'
15+
require 'support/database/postgresql_adapter'
16+
'postgresql'
17+
end
818

919
require 'activerecord_json_validator'
1020

@@ -17,7 +27,6 @@
1727
config.include ModelMacros
1828

1929
config.before :each do
20-
adapter = ENV['DB_ADAPTER'] || 'postgresql'
2130
setup_database(adapter: adapter, database: 'activerecord_json_validator_test')
2231
end
2332
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
3+
require 'active_record'
4+
class DatabaseAdapter
5+
attr_accessor :database
6+
7+
def initialize(opts = {})
8+
self.database = opts[:database]
9+
end
10+
11+
def reset_database!
12+
raise 'Define reset_database! in subclasses!'
13+
end
14+
15+
def establish_connection!
16+
raise 'Define establish_connection! in subclasses!'
17+
end
18+
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
3+
require_relative 'database_adapter'
4+
5+
class MysqlAdapter < DatabaseAdapter
6+
def reset_database!
7+
ActiveRecord::Base.connection.execute("SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema = '#{database}';")
8+
end
9+
10+
def establish_connection!
11+
ActiveRecord::Base.establish_connection(
12+
ENV.fetch(
13+
'DATABASE_URL',
14+
'mysql2://root:@127.0.0.1:3306/activerecord_json_validator_test?pool=5'
15+
)
16+
)
17+
end
18+
end
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
# frozen_string_literal: true
22

3+
require 'pg'
34
require_relative 'database_adapter'
45

56
class PostgresqlAdapter < DatabaseAdapter
67
def reset_database!
78
ActiveRecord::Base.connection.execute('drop schema public cascade;')
89
ActiveRecord::Base.connection.execute('create schema public;')
910
end
11+
12+
def establish_connection!
13+
ActiveRecord::Base.establish_connection(
14+
ENV.fetch(
15+
'DATABASE_URL',
16+
'postgres://postgres@localhost/activerecord_json_validator_test'
17+
)
18+
)
19+
end
1020
end

0 commit comments

Comments
 (0)