Add model ContactNetwork
This commit is contained in:
parent
1712ba9e92
commit
ac42930306
|
@ -0,0 +1,36 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ContactNetwork < ApplicationRecord
|
||||||
|
NICKNAME_RE = /\A[a-z][a-z0-9]*(_[a-z0-9]+)*\z/.freeze
|
||||||
|
|
||||||
|
#############
|
||||||
|
# Callbacks #
|
||||||
|
#############
|
||||||
|
|
||||||
|
before_validation :turn_blanks_into_nils
|
||||||
|
before_validation :strip_extra_spaces
|
||||||
|
|
||||||
|
###############
|
||||||
|
# Validations #
|
||||||
|
###############
|
||||||
|
|
||||||
|
validates :nickname,
|
||||||
|
presence: true,
|
||||||
|
length: { in: 3..36 },
|
||||||
|
format: NICKNAME_RE,
|
||||||
|
uniqueness: { case_sensitive: false }
|
||||||
|
|
||||||
|
validates :public_name, allow_nil: true, length: { in: 1..255 }
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def turn_blanks_into_nils
|
||||||
|
self.nickname = nil if nickname.blank?
|
||||||
|
self.public_name = nil if public_name.blank?
|
||||||
|
end
|
||||||
|
|
||||||
|
def strip_extra_spaces
|
||||||
|
self.nickname = nickname&.strip
|
||||||
|
self.public_name = public_name&.strip
|
||||||
|
end
|
||||||
|
end
|
|
@ -136,6 +136,13 @@ private
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_tables
|
def change_tables
|
||||||
|
create_table :contact_networks do |t|
|
||||||
|
t.timestamps null: false
|
||||||
|
|
||||||
|
t.string :nickname, null: false, index: { unique: true }
|
||||||
|
t.string :public_name, null: false, index: { unique: true }
|
||||||
|
end
|
||||||
|
|
||||||
create_table :contact_lists do |t|
|
create_table :contact_lists do |t|
|
||||||
t.timestamps null: false
|
t.timestamps null: false
|
||||||
end
|
end
|
||||||
|
@ -342,6 +349,14 @@ private
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_constraints
|
def change_constraints
|
||||||
|
constraint :contact_networks, :nickname, <<~SQL
|
||||||
|
is_nickname(nickname)
|
||||||
|
SQL
|
||||||
|
|
||||||
|
constraint :contact_networks, :public_name, <<~SQL
|
||||||
|
is_good_small_text(public_name)
|
||||||
|
SQL
|
||||||
|
|
||||||
constraint :relationships, :dates, <<~SQL
|
constraint :relationships, :dates, <<~SQL
|
||||||
until_date IS NULL OR from_date < until_date
|
until_date IS NULL OR from_date < until_date
|
||||||
SQL
|
SQL
|
||||||
|
|
|
@ -403,6 +403,40 @@ CREATE SEQUENCE public.contact_lists_id_seq
|
||||||
ALTER SEQUENCE public.contact_lists_id_seq OWNED BY public.contact_lists.id;
|
ALTER SEQUENCE public.contact_lists_id_seq OWNED BY public.contact_lists.id;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: contact_networks; Type: TABLE; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE TABLE public.contact_networks (
|
||||||
|
id bigint NOT NULL,
|
||||||
|
created_at timestamp(6) without time zone NOT NULL,
|
||||||
|
updated_at timestamp(6) without time zone NOT NULL,
|
||||||
|
nickname character varying NOT NULL,
|
||||||
|
public_name character varying NOT NULL,
|
||||||
|
CONSTRAINT nickname CHECK (public.is_nickname((nickname)::text)),
|
||||||
|
CONSTRAINT public_name CHECK (public.is_good_small_text((public_name)::text))
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: contact_networks_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE SEQUENCE public.contact_networks_id_seq
|
||||||
|
START WITH 1
|
||||||
|
INCREMENT BY 1
|
||||||
|
NO MINVALUE
|
||||||
|
NO MAXVALUE
|
||||||
|
CACHE 1;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: contact_networks_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER SEQUENCE public.contact_networks_id_seq OWNED BY public.contact_networks.id;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: federal_subjects; Type: TABLE; Schema: public; Owner: -
|
-- Name: federal_subjects; Type: TABLE; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -818,6 +852,13 @@ ALTER TABLE ONLY public.active_storage_blobs ALTER COLUMN id SET DEFAULT nextval
|
||||||
ALTER TABLE ONLY public.contact_lists ALTER COLUMN id SET DEFAULT nextval('public.contact_lists_id_seq'::regclass);
|
ALTER TABLE ONLY public.contact_lists ALTER COLUMN id SET DEFAULT nextval('public.contact_lists_id_seq'::regclass);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: contact_networks id; Type: DEFAULT; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY public.contact_networks ALTER COLUMN id SET DEFAULT nextval('public.contact_networks_id_seq'::regclass);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: federal_subjects id; Type: DEFAULT; Schema: public; Owner: -
|
-- Name: federal_subjects id; Type: DEFAULT; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -929,6 +970,14 @@ ALTER TABLE ONLY public.contact_lists
|
||||||
ADD CONSTRAINT contact_lists_pkey PRIMARY KEY (id);
|
ADD CONSTRAINT contact_lists_pkey PRIMARY KEY (id);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: contact_networks contact_networks_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
ALTER TABLE ONLY public.contact_networks
|
||||||
|
ADD CONSTRAINT contact_networks_pkey PRIMARY KEY (id);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: federal_subjects federal_subjects_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
-- Name: federal_subjects federal_subjects_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
@ -1072,6 +1121,20 @@ CREATE UNIQUE INDEX index_active_storage_attachments_uniqueness ON public.active
|
||||||
CREATE UNIQUE INDEX index_active_storage_blobs_on_key ON public.active_storage_blobs USING btree (key);
|
CREATE UNIQUE INDEX index_active_storage_blobs_on_key ON public.active_storage_blobs USING btree (key);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: index_contact_networks_on_nickname; Type: INDEX; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX index_contact_networks_on_nickname ON public.contact_networks USING btree (nickname);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: index_contact_networks_on_public_name; Type: INDEX; Schema: public; Owner: -
|
||||||
|
--
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX index_contact_networks_on_public_name ON public.contact_networks USING btree (public_name);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: index_federal_subjects_on_english_name; Type: INDEX; Schema: public; Owner: -
|
-- Name: index_federal_subjects_on_english_name; Type: INDEX; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
FactoryBot.define do
|
||||||
|
factory :contact_network, class: ContactNetwork do
|
||||||
|
nickname { Faker::Internet.username 3..36, %w[_] }
|
||||||
|
public_name { Faker::Company.name }
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,75 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe ContactNetwork do
|
||||||
|
subject { create :contact_network }
|
||||||
|
|
||||||
|
describe '#nickname' do
|
||||||
|
def allow_value(*)
|
||||||
|
super.for :nickname
|
||||||
|
end
|
||||||
|
|
||||||
|
it { is_expected.to validate_presence_of :nickname }
|
||||||
|
|
||||||
|
it do
|
||||||
|
is_expected.to validate_length_of(:nickname).is_at_least(3).is_at_most(36)
|
||||||
|
end
|
||||||
|
|
||||||
|
it { is_expected.to validate_uniqueness_of(:nickname).case_insensitive }
|
||||||
|
|
||||||
|
it { is_expected.not_to allow_value nil }
|
||||||
|
it { is_expected.not_to allow_value '' }
|
||||||
|
it { is_expected.not_to allow_value ' ' * 3 }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value Faker::Internet.username(3..36, %w[_]) }
|
||||||
|
it { is_expected.to allow_value 'foo_bar' }
|
||||||
|
it { is_expected.to allow_value 'foo123' }
|
||||||
|
|
||||||
|
it do
|
||||||
|
is_expected.not_to \
|
||||||
|
allow_value Faker::Internet.username(3..36, %w[_]).upcase
|
||||||
|
end
|
||||||
|
|
||||||
|
it { is_expected.not_to allow_value Faker::Internet.email }
|
||||||
|
it { is_expected.not_to allow_value '_foo' }
|
||||||
|
it { is_expected.not_to allow_value 'bar_' }
|
||||||
|
it { is_expected.not_to allow_value '1foo' }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#public_name' do
|
||||||
|
def allow_value(*)
|
||||||
|
super.for :public_name
|
||||||
|
end
|
||||||
|
|
||||||
|
it { is_expected.to allow_value nil }
|
||||||
|
it { is_expected.to allow_value '' }
|
||||||
|
it { is_expected.to allow_value ' ' }
|
||||||
|
|
||||||
|
it { is_expected.to allow_value Faker::Name.name }
|
||||||
|
it { is_expected.to allow_value Faker::Name.first_name }
|
||||||
|
it { is_expected.to allow_value 'Foo Bar' }
|
||||||
|
|
||||||
|
it { is_expected.to validate_length_of(:public_name).is_at_most(255) }
|
||||||
|
|
||||||
|
context 'when it was set to blank value' do
|
||||||
|
subject { create :personal_account, public_name: ' ' * rand(100) }
|
||||||
|
|
||||||
|
specify do
|
||||||
|
expect(subject.public_name).to eq nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when it was set to value with leading and trailing spaces' do
|
||||||
|
subject { create :personal_account, public_name: public_name }
|
||||||
|
|
||||||
|
let :public_name do
|
||||||
|
"#{' ' * rand(4)}#{Faker::Name.name}#{' ' * rand(4)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
specify do
|
||||||
|
expect(subject.public_name).to eq public_name.strip
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Reference in New Issue