1
0
Fork 0

Add model ContactNetwork

This commit is contained in:
Alex Kotov 2019-08-05 02:05:57 +05:00
parent 1712ba9e92
commit ac42930306
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
5 changed files with 197 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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: -
--

View File

@ -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

View File

@ -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