Add SDG::Review model

and its relation with relatables

Note about sdg_review factory: Cannot use the constantize method on
the relatable_type as long as the relatable classes will be loaded and
this will throw an exception because the database is not available at
factiry definition time.
This commit is contained in:
Senén Rodero Rodríguez
2020-12-21 16:04:19 +01:00
parent 60c3c6b6e2
commit 0368aa459f
7 changed files with 67 additions and 0 deletions

View File

@@ -10,6 +10,8 @@ module SDG::Relatable
source: :related_sdg,
source_type: sdg_type
end
has_one :sdg_review, as: :relatable, dependent: :destroy, class_name: "SDG::Review"
end
class_methods do

5
app/models/sdg/review.rb Normal file
View File

@@ -0,0 +1,5 @@
class SDG::Review < ApplicationRecord
validates :relatable_id, uniqueness: { scope: [:relatable_type] }
belongs_to :relatable, polymorphic: true, optional: false
end

View File

@@ -0,0 +1,8 @@
class CreateSDGReviews < ActiveRecord::Migration[5.2]
def change
create_table :sdg_reviews do |t|
t.references :relatable, polymorphic: true, index: { unique: true }
t.timestamps
end
end
end

View File

@@ -1352,6 +1352,14 @@ ActiveRecord::Schema.define(version: 2021_01_07_125458) do
t.index ["related_sdg_type", "related_sdg_id"], name: "index_sdg_relations_on_related_sdg_type_and_related_sdg_id"
end
create_table "sdg_reviews", force: :cascade do |t|
t.string "relatable_type"
t.bigint "relatable_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["relatable_type", "relatable_id"], name: "index_sdg_reviews_on_relatable_type_and_relatable_id", unique: true
end
create_table "sdg_targets", force: :cascade do |t|
t.bigint "goal_id"
t.string "code", null: false

View File

@@ -18,4 +18,13 @@ FactoryBot.define do
factory :sdg_phase, class: "SDG::Phase" do
kind { :sensitization }
end
factory :sdg_review, class: "SDG::Review" do
SDG::Related::RELATABLE_TYPES.map { |relatable_type| relatable_type.downcase.gsub("::", "_") }
.each do |relatable|
trait :"#{relatable}_review" do
association :relatable, factory: relatable
end
end
end
end

View File

@@ -117,6 +117,18 @@ describe SDG::Relatable do
end
end
describe "#sdg_review" do
it "returns nil when relatable is not reviewed" do
expect(relatable.sdg_review).to be_blank
end
it "returns the review when relatable is reviewed" do
review = create(:sdg_review, relatable: relatable)
expect(relatable.sdg_review).to eq(review)
end
end
describe ".by_goal" do
it "returns everything if no code is provided" do
expect(relatable.class.by_goal("")).to eq [relatable]

View File

@@ -0,0 +1,23 @@
require "rails_helper"
describe SDG::Review do
describe "Validations" do
it "is valid for any given relatable" do
review = build(:sdg_review, :debate_review)
expect(review).to be_valid
end
it "is not valid without a relatable" do
review = build(:sdg_review, relatable: nil)
expect(review).not_to be_valid
end
it "is not valid when a review for given relatable already exists" do
relatable = create(:sdg_review, :proposal_review).relatable
expect(build(:sdg_review, relatable: relatable)).not_to be_valid
end
end
end