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
|
||||
|
||||
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|
|
||||
t.timestamps null: false
|
||||
end
|
||||
|
@ -342,6 +349,14 @@ private
|
|||
end
|
||||
|
||||
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
|
||||
until_date IS NULL OR from_date < until_date
|
||||
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;
|
||||
|
||||
|
||||
--
|
||||
-- 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: -
|
||||
--
|
||||
|
@ -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);
|
||||
|
||||
|
||||
--
|
||||
-- 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: -
|
||||
--
|
||||
|
@ -929,6 +970,14 @@ ALTER TABLE ONLY public.contact_lists
|
|||
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: -
|
||||
--
|
||||
|
@ -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);
|
||||
|
||||
|
||||
--
|
||||
-- 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: -
|
||||
--
|
||||
|
|
|
@ -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