1
0
Fork 0

Validate Relationship#person

This commit is contained in:
Alex Kotov 2019-10-02 23:13:02 +05:00
parent 0cc33233d2
commit 6e2c9ede99
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
4 changed files with 57 additions and 11 deletions

View File

@ -165,6 +165,7 @@ class AddHierarchy < ActiveRecord::Migration[6.0]
$$
DECLARE
org_unit record;
person record;
parent_unit record;
parent_rel record;
BEGIN
@ -172,15 +173,28 @@ class AddHierarchy < ActiveRecord::Migration[6.0]
RAISE EXCEPTION 'does not have org unit';
END IF;
IF NEW.person_id IS NULL THEN
RAISE EXCEPTION 'does not have person';
END IF;
SELECT *
FROM org_units
INTO org_unit
WHERE id = NEW.org_unit_id;
SELECT *
FROM people
INTO person
WHERE id = NEW.person_id;
IF org_unit IS NULL THEN
RAISE EXCEPTION 'can not find org unit';
END IF;
IF person IS NULL THEN
RAISE EXCEPTION 'can not find person';
END IF;
SELECT *
FROM org_units
INTO parent_unit
@ -217,11 +231,16 @@ class AddHierarchy < ActiveRecord::Migration[6.0]
RAISE EXCEPTION 'parent rel is invalid';
END IF;
IF parent_rel.person_id != person.id THEN
RAISE EXCEPTION 'person is invalid';
END IF;
IF (
NEW.level != org_unit.level OR
NEW.level != parent_unit.level + 1 OR
NEW.level != parent_rel.level + 1
) THEN
RAISE EXCEPTION 'level is invalid';
END IF;
END IF;

View File

@ -318,6 +318,7 @@ CREATE FUNCTION public.validate_relationship_hierarchy() RETURNS trigger
AS $$
DECLARE
org_unit record;
person record;
parent_unit record;
parent_rel record;
BEGIN
@ -325,15 +326,28 @@ BEGIN
RAISE EXCEPTION 'does not have org unit';
END IF;
IF NEW.person_id IS NULL THEN
RAISE EXCEPTION 'does not have person';
END IF;
SELECT *
FROM org_units
INTO org_unit
WHERE id = NEW.org_unit_id;
SELECT *
FROM people
INTO person
WHERE id = NEW.person_id;
IF org_unit IS NULL THEN
RAISE EXCEPTION 'can not find org unit';
END IF;
IF person IS NULL THEN
RAISE EXCEPTION 'can not find person';
END IF;
SELECT *
FROM org_units
INTO parent_unit
@ -370,11 +384,16 @@ BEGIN
RAISE EXCEPTION 'parent rel is invalid';
END IF;
IF parent_rel.person_id != person.id THEN
RAISE EXCEPTION 'person is invalid';
END IF;
IF (
NEW.level != org_unit.level OR
NEW.level != parent_unit.level + 1 OR
NEW.level != parent_rel.level + 1
) THEN
RAISE EXCEPTION 'level is invalid';
END IF;
END IF;

View File

@ -14,7 +14,9 @@ FactoryBot.define do
association :org_unit, factory: :some_children_org_unit
parent_rel do
create :some_root_relationship, org_unit: org_unit&.parent_unit
create :some_root_relationship,
person: person,
org_unit: org_unit&.parent_unit
end
end
end
@ -23,13 +25,13 @@ FactoryBot.define do
parent: :some_root_relationship,
traits: %i[with_parent]
factory :excluded_relationship, parent: :some_children_relationship do
factory :excluded_relationship, parent: :some_root_relationship do
association :org_unit, factory: :lpr_org_unit
association :status, factory: :excluded_member_relation_status
parent_rel { nil }
end
factory :included_relationship, parent: :some_children_relationship do
factory :included_relationship, parent: :some_root_relationship do
association :org_unit, factory: :lpr_org_unit
association :status, factory: :included_relation_status
parent_rel { nil }
@ -38,48 +40,48 @@ FactoryBot.define do
factory :supporter_relationship, parent: :excluded_relationship do
association :org_unit, factory: :moscow_reg_dept_org_unit
association :status, factory: :supporter_relation_status
association :parent_rel, factory: :included_relationship
parent_rel { create :included_relationship, person: person }
end
factory :member_relationship, parent: :excluded_relationship do
association :org_unit, factory: :moscow_reg_dept_org_unit
association :status, factory: :active_member_relation_status
association :parent_rel, factory: :included_relationship
parent_rel { create :included_relationship, person: person }
end
factory :federal_manager_relationship, parent: :excluded_relationship do
association :org_unit, factory: :fed_management_org_unit
association :status, factory: :fed_manager_relation_status
association :parent_rel, factory: :included_relationship
parent_rel { create :included_relationship, person: person }
end
factory :federal_supervisor_relationship, parent: :excluded_relationship do
association :org_unit, factory: :fed_supervision_org_unit
association :status, factory: :fed_supervisor_relation_status
association :parent_rel, factory: :included_relationship
parent_rel { create :included_relationship, person: person }
end
factory :regional_manager_relationship, parent: :excluded_relationship do
association :org_unit, factory: :moscow_reg_management_org_unit
association :status, factory: :reg_manager_relation_status
association :parent_rel, factory: :member_relationship
parent_rel { create :member_relationship, person: person }
end
factory :regional_supervisor_relationship, parent: :excluded_relationship do
association :org_unit, factory: :moscow_reg_supervision_org_unit
association :status, factory: :reg_supervisor_relation_status
association :parent_rel, factory: :member_relationship
parent_rel { create :member_relationship, person: person }
end
factory :federal_secretary_relationship, parent: :excluded_relationship do
association :org_unit, factory: :fed_management_org_unit
association :status, factory: :fed_secretary_relation_status
association :parent_rel, factory: :included_relationship
parent_rel { create :included_relationship, person: person }
end
factory :regional_secretary_relationship, parent: :excluded_relationship do
association :org_unit, factory: :moscow_reg_management_org_unit
association :status, factory: :reg_secretary_relation_status
association :parent_rel, factory: :member_relationship
parent_rel { create :member_relationship, person: person }
end
end

View File

@ -58,21 +58,26 @@ RSpec.describe Person do
end
describe '#all_relationships' do
let(:parent_relationship) { create :included_relationship, person: subject }
let! :relationship_2 do
create :supporter_relationship,
person: subject,
parent_rel: parent_relationship,
from_date: 4.days.ago
end
let! :relationship_3 do
create :supporter_relationship,
person: subject,
parent_rel: parent_relationship,
from_date: 2.days.ago
end
let! :relationship_1 do
create :supporter_relationship,
person: subject,
parent_rel: parent_relationship,
from_date: 6.days.ago
end
@ -87,6 +92,7 @@ RSpec.describe Person do
specify do
expect(subject.all_relationships).to eq [
parent_relationship,
relationship_1,
relationship_2,
relationship_3,