Merge pull request #12 from petergoldstein/feature/add_postgres

Get Postgres running
main
Washington Botelho 2022-08-08 18:48:03 -03:00 committed by GitHub
commit 4af463642c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 101 additions and 34 deletions

View File

@ -4,12 +4,19 @@ on: [push, pull_request]
jobs: jobs:
test: test:
env:
DB: ${{ matrix.db }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
db:
- mysql
- postgres
ruby: ruby:
- '2.7' - '2.7'
- '3.0' - '3.0'
@ -27,6 +34,23 @@ jobs:
ports: ports:
- 3306:3306 - 3306:3306
postgres:
env:
POSTGRES_DB: rating_test
POSTGRES_USER: postgres
POSTGRES_HOST_AUTH_METHOD: trust
image: postgres:alpine
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3

View File

@ -51,7 +51,7 @@ Metrics/ParameterLists:
# AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339 # AllowedIdentifiers: capture3, iso8601, rfc1123_date, rfc822, rfc2822, rfc3339
Naming/VariableNumber: Naming/VariableNumber:
Exclude: Exclude:
- 'spec/support/mysql.rb' - 'spec/support/database.rb'
# Offense count: 9 # Offense count: 9
# This cop supports safe auto-correction (--auto-correct). # This cop supports safe auto-correction (--auto-correct).

View File

@ -71,6 +71,7 @@ GEM
parallel (1.22.1) parallel (1.22.1)
parser (3.1.2.0) parser (3.1.2.0)
ast (~> 2.4.1) ast (~> 2.4.1)
pg (1.3.5)
racc (1.6.0) racc (1.6.0)
rack (2.2.3) rack (2.2.3)
rack-test (1.1.0) rack-test (1.1.0)
@ -128,7 +129,7 @@ GEM
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.7.0, < 2.0) rubocop (>= 1.7.0, < 2.0)
rubocop-rspec (2.10.0) rubocop-rspec (2.11.0)
rubocop (~> 1.19) rubocop (~> 1.19)
ruby-progressbar (1.11.0) ruby-progressbar (1.11.0)
shoulda-matchers (5.1.0) shoulda-matchers (5.1.0)
@ -154,6 +155,7 @@ DEPENDENCIES
debug debug
factory_bot_rails factory_bot_rails
mysql2 mysql2
pg
rating! rating!
rspec-rails rspec-rails
rubocop-performance rubocop-performance

View File

@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
spec.add_development_dependency 'debug' spec.add_development_dependency 'debug'
spec.add_development_dependency 'factory_bot_rails' spec.add_development_dependency 'factory_bot_rails'
spec.add_development_dependency 'mysql2' spec.add_development_dependency 'mysql2'
spec.add_development_dependency 'pg'
spec.add_development_dependency 'rspec-rails' spec.add_development_dependency 'rspec-rails'
spec.add_development_dependency 'rubocop-performance' spec.add_development_dependency 'rubocop-performance'
spec.add_development_dependency 'rubocop-rails' spec.add_development_dependency 'rubocop-rails'

View File

@ -9,7 +9,7 @@ require 'debug'
require 'rating' require 'rating'
require 'support/common' require 'support/common'
require 'support/mysql' require 'support/database'
require 'support/database_cleaner' require 'support/database_cleaner'
require 'support/factory_bot' require 'support/factory_bot'
require 'support/migrate' require 'support/migrate'

View File

@ -13,7 +13,14 @@ RSpec.describe Rating::Rating, ':averager_data' do
end end
it 'returns the average of number of records for the given resource type' do it 'returns the average of number of records for the given resource type' do
expect(result.as_json['count_avg'].to_s).to eq '1.333333333333333333' case ENV.fetch('DB')
when 'mysql'
expect(result.count_avg).to eq(BigDecimal('1.333333333333333333'))
when 'postgres'
expect(result.count_avg).to eq(BigDecimal('1.3333333333333333'))
else
raise('DB env missing!')
end
end end
end end

View File

@ -21,7 +21,14 @@ RSpec.describe Rating::Rating, ':data' do
end end
it 'returns the estimate for a resource' do it 'returns the estimate for a resource' do
expect(result[:estimate].to_s).to eq '42.5000000000000000012000000505' case ENV.fetch('DB')
when 'mysql'
expect(result[:estimate]).to eq(BigDecimal('42.5000000000000000012000000505'))
when 'postgres'
expect(result[:estimate]).to eq(BigDecimal('42.5000000000000001200000000000000012505'))
else
raise('DB env missing!')
end
end end
end end

View File

@ -9,10 +9,19 @@ RSpec.describe Rating::Rating, ':update_rating' do
it 'updates the rating data of the given resource' do it 'updates the rating data of the given resource' do
record = described_class.find_by(resource: article_1) record = described_class.find_by(resource: article_1)
expect(record.average).to eq 50.5 case ENV.fetch('DB')
expect(record.estimate).to eq 42.5 when 'mysql'
expect(record.sum).to eq 101 expect(record.average).to eq(BigDecimal('50.5'))
expect(record.total).to eq 2 expect(record.estimate).to eq(BigDecimal('42.5'))
when 'postgres'
expect(record.average).to eq(BigDecimal('50.5'))
expect(record.estimate).to eq(BigDecimal('42.5000000000000001'))
else
raise('DB env missing!')
end
expect(record.sum).to be(101)
expect(record.total).to be(2)
end end
end end
@ -22,26 +31,26 @@ RSpec.describe Rating::Rating, ':update_rating' do
it 'updates the rating data of the given resource respecting the scope' do it 'updates the rating data of the given resource respecting the scope' do
record = described_class.find_by(resource: article_1, scopeable: category) record = described_class.find_by(resource: article_1, scopeable: category)
expect(record.average).to eq 1.5 expect(record.average).to eq(BigDecimal('1.5'))
expect(record.estimate).to eq 1.5 expect(record.estimate).to eq(BigDecimal('1.5'))
expect(record.sum).to eq 3 expect(record.sum).to be(3)
expect(record.total).to eq 2 expect(record.total).to be(2)
end end
end end
context 'when rate table has no record' do context 'when rate table has no record' do
let!(:resource) { create :article } let!(:resource) { create(:article) }
let!(:scope) { nil } let!(:scope) { nil }
it 'calculates with counts values as zero' do it 'calculates with counts values as zero' do
described_class.update_rating resource, scope described_class.update_rating(resource, scope)
record = described_class.last record = described_class.last
expect(record.average).to eq 0 expect(record.average).to eq(BigDecimal('0.0'))
expect(record.estimate).to eq 0 expect(record.estimate).to eq(BigDecimal('0.0'))
expect(record.sum).to eq 0 expect(record.sum).to be(0)
expect(record.total).to eq 0 expect(record.total).to be(0)
end end
end end
end end

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
ENV['DB'] ||= 'postgres'
conn_params = { database: :rating_test, host: '127.0.0.1' }
case ENV.fetch('DB')
when 'mysql'
require 'mysql2'
client = Mysql2::Client.new(host: conn_params[:host], username: :root)
conn_params[:adapter] = :mysql2
conn_params[:username] = :root
when 'postgres'
require 'pg'
client = PG::Connection.new(host: conn_params[:host], password: '', user: :postgres)
conn_params[:adapter] = :postgresql
conn_params[:username] = :postgres
end
client.query('DROP DATABASE IF EXISTS rating_test;')
client.query('CREATE DATABASE rating_test;')
ActiveRecord::Base.establish_connection(conn_params)

View File

@ -5,8 +5,8 @@ class CreateRatingTable < ActiveRecord::Migration[7.0]
create_table :rating_ratings do |t| create_table :rating_ratings do |t|
t.decimal :average, default: 0, mull: false, precision: 25, scale: 16 t.decimal :average, default: 0, mull: false, precision: 25, scale: 16
t.decimal :estimate, default: 0, mull: false, precision: 25, scale: 16 t.decimal :estimate, default: 0, mull: false, precision: 25, scale: 16
t.bigint :sum, default: 0, mull: false t.bigint :sum, default: 0, mull: false
t.bigint :total, default: 0, mull: false t.bigint :total, default: 0, mull: false
t.references :resource, index: true, null: false, polymorphic: true t.references :resource, index: true, null: false, polymorphic: true
t.references :scopeable, index: true, null: true, polymorphic: true t.references :scopeable, index: true, null: true, polymorphic: true

View File

@ -5,8 +5,8 @@ class CreateReviewRatingsTable < ActiveRecord::Migration[7.0]
create_table :review_ratings do |t| create_table :review_ratings do |t|
t.decimal :average, default: 0, mull: false, precision: 25, scale: 16 t.decimal :average, default: 0, mull: false, precision: 25, scale: 16
t.decimal :estimate, default: 0, mull: false, precision: 25, scale: 16 t.decimal :estimate, default: 0, mull: false, precision: 25, scale: 16
t.bigint :sum, default: 0, mull: false t.bigint :sum, default: 0, mull: false
t.bigint :total, default: 0, mull: false t.bigint :total, default: 0, mull: false
t.references :resource, index: true, null: false, polymorphic: true t.references :resource, index: true, null: false, polymorphic: true
t.references :scopeable, index: true, null: true, polymorphic: true t.references :scopeable, index: true, null: true, polymorphic: true

View File

@ -1,10 +0,0 @@
# frozen_string_literal: true
require 'mysql2'
client = Mysql2::Client.new(host: '127.0.0.1', username: :root)
client.query('DROP DATABASE IF EXISTS rating_test;')
client.query('CREATE DATABASE IF NOT EXISTS rating_test;')
ActiveRecord::Base.establish_connection(adapter: :mysql2, database: :rating_test, username: :root, host: '127.0.0.1')