Add new model Poll Total Result with specs and relations

This commit is contained in:
Bertocq
2017-09-14 13:51:27 +02:00
parent f7568a394f
commit 1f867fb227
8 changed files with 136 additions and 1 deletions

View File

@@ -287,6 +287,7 @@ Lint/StringConversionInInterpolation:
- 'app/models/poll/null_result.rb' - 'app/models/poll/null_result.rb'
- 'app/models/poll/partial_result.rb' - 'app/models/poll/partial_result.rb'
- 'app/models/poll/white_result.rb' - 'app/models/poll/white_result.rb'
- 'app/models/poll/total_result.rb'
# Offense count: 15 # Offense count: 15
# Cop supports --auto-correct. # Cop supports --auto-correct.
@@ -562,6 +563,7 @@ Style/MutableConstant:
- 'app/models/poll/null_result.rb' - 'app/models/poll/null_result.rb'
- 'app/models/poll/partial_result.rb' - 'app/models/poll/partial_result.rb'
- 'app/models/poll/white_result.rb' - 'app/models/poll/white_result.rb'
- 'app/models/poll/total_result.rb'
- 'app/models/proposal.rb' - 'app/models/proposal.rb'
- 'app/models/signature_sheet.rb' - 'app/models/signature_sheet.rb'
- 'app/models/site_customization/content_block.rb' - 'app/models/site_customization/content_block.rb'

View File

@@ -4,6 +4,7 @@ class Poll < ActiveRecord::Base
has_many :partial_results, through: :booth_assignments has_many :partial_results, through: :booth_assignments
has_many :white_results, through: :booth_assignments has_many :white_results, through: :booth_assignments
has_many :null_results, through: :booth_assignments has_many :null_results, through: :booth_assignments
has_many :total_results, through: :booth_assignments
has_many :voters has_many :voters
has_many :officer_assignments, through: :booth_assignments has_many :officer_assignments, through: :booth_assignments
has_many :officers, through: :officer_assignments has_many :officers, through: :officer_assignments

View File

@@ -10,5 +10,6 @@ class Poll
has_many :partial_results has_many :partial_results
has_many :white_results has_many :white_results
has_many :null_results has_many :null_results
has_many :total_results
end end
end end

View File

@@ -0,0 +1,23 @@
class Poll::TotalResult < ActiveRecord::Base
VALID_ORIGINS = %w{web booth}
belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id'
belongs_to :booth_assignment
belongs_to :officer_assignment
validates :author, presence: true
validates :origin, inclusion: {in: VALID_ORIGINS}
scope :by_author, ->(author_id) { where(author_id: author_id) }
before_save :update_logs
def update_logs
if amount_changed? && amount_was.present?
self.amount_log += ":#{amount_was.to_s}"
self.officer_assignment_id_log += ":#{officer_assignment_id_was.to_s}"
self.author_id_log += ":#{author_id_was.to_s}"
end
end
end

View File

@@ -0,0 +1,18 @@
class CreatePollTotalResults < ActiveRecord::Migration
def change
create_table :poll_total_results do |t|
t.integer :author_id
t.integer :amount
t.string :origin
t.date :date
t.integer :booth_assignment_id
t.integer :officer_assignment_id
t.text :amount_log, default: ""
t.text :officer_assignment_id_log, default: ""
t.text :author_id_log, default: ""
end
add_index :poll_total_results, :officer_assignment_id
add_index :poll_total_results, :booth_assignment_id
end
end

View File

@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20170908175149) do ActiveRecord::Schema.define(version: 20170914114427) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@@ -691,6 +691,21 @@ ActiveRecord::Schema.define(version: 20170908175149) do
add_index "poll_shifts", ["booth_id"], name: "index_poll_shifts_on_booth_id", using: :btree add_index "poll_shifts", ["booth_id"], name: "index_poll_shifts_on_booth_id", using: :btree
add_index "poll_shifts", ["officer_id"], name: "index_poll_shifts_on_officer_id", using: :btree add_index "poll_shifts", ["officer_id"], name: "index_poll_shifts_on_officer_id", using: :btree
create_table "poll_total_results", force: :cascade do |t|
t.integer "author_id"
t.integer "amount"
t.string "origin"
t.date "date"
t.integer "booth_assignment_id"
t.integer "officer_assignment_id"
t.text "amount_log", default: ""
t.text "officer_assignment_id_log", default: ""
t.text "author_id_log", default: ""
end
add_index "poll_total_results", ["booth_assignment_id"], name: "index_poll_total_results_on_booth_assignment_id", using: :btree
add_index "poll_total_results", ["officer_assignment_id"], name: "index_poll_total_results_on_officer_assignment_id", using: :btree
create_table "poll_voters", force: :cascade do |t| create_table "poll_voters", force: :cascade do |t|
t.string "document_number" t.string "document_number"
t.string "document_type" t.string "document_type"

View File

@@ -556,6 +556,11 @@ FactoryGirl.define do
origin { 'web' } origin { 'web' }
end end
factory :poll_total_result, class: 'Poll::TotalResult' do
association :author, factory: :user
origin { 'web' }
end
factory :officing_residence, class: 'Officing::Residence' do factory :officing_residence, class: 'Officing::Residence' do
user user
association :officer, factory: :poll_officer association :officer, factory: :poll_officer

View File

@@ -0,0 +1,70 @@
require 'rails_helper'
describe Poll::TotalResult do
describe "logging changes" do
it "should update amount_log if amount changes" do
total_result = create(:poll_total_result, amount: 33)
expect(total_result.amount_log).to eq("")
total_result.amount = 33
total_result.save
total_result.amount = 32
total_result.save
total_result.amount = 34
total_result.save
expect(total_result.amount_log).to eq(":33:32")
end
it "should update officer_assignment_id_log if amount changes" do
total_result = create(:poll_total_result, amount: 33)
expect(total_result.amount_log).to eq("")
expect(total_result.officer_assignment_id_log).to eq("")
total_result.amount = 33
total_result.officer_assignment = create(:poll_officer_assignment, id: 101)
total_result.save
total_result.amount = 32
total_result.officer_assignment = create(:poll_officer_assignment, id: 102)
total_result.save
total_result.amount = 34
total_result.officer_assignment = create(:poll_officer_assignment, id: 103)
total_result.save
expect(total_result.amount_log).to eq(":33:32")
expect(total_result.officer_assignment_id_log).to eq(":101:102")
end
it "should update author_id if amount changes" do
total_result = create(:poll_total_result, amount: 33)
expect(total_result.amount_log).to eq("")
expect(total_result.author_id_log).to eq("")
author_A = create(:poll_officer).user
author_B = create(:poll_officer).user
author_C = create(:poll_officer).user
total_result.amount = 33
total_result.author_id = author_A.id
total_result.save!
total_result.amount = 32
total_result.author_id = author_B.id
total_result.save!
total_result.amount = 34
total_result.author_id = author_C.id
total_result.save!
expect(total_result.amount_log).to eq(":33:32")
expect(total_result.author_id_log).to eq(":#{author_A.id}:#{author_B.id}")
end
end
end