diff --git a/app/models/post_status.rb b/app/models/post_status.rb new file mode 100644 index 00000000..d7f3b101 --- /dev/null +++ b/app/models/post_status.rb @@ -0,0 +1,4 @@ +class PostStatus < ApplicationRecord + validates :name, presence: true, uniqueness: true + validates :color, format: { with: /\A#(?:[0-9a-fA-F]{3}){1,2}\z/ } +end diff --git a/db/migrate/20190824093336_create_post_statuses.rb b/db/migrate/20190824093336_create_post_statuses.rb new file mode 100644 index 00000000..2d5c69b6 --- /dev/null +++ b/db/migrate/20190824093336_create_post_statuses.rb @@ -0,0 +1,10 @@ +class CreatePostStatuses < ActiveRecord::Migration[6.0] + def change + create_table :post_statuses do |t| + t.string :name + t.string :color + + t.timestamps + end + end +end diff --git a/db/migrate/20190824093755_add_unique_to_name_of_post_statuses.rb b/db/migrate/20190824093755_add_unique_to_name_of_post_statuses.rb new file mode 100644 index 00000000..de598cf9 --- /dev/null +++ b/db/migrate/20190824093755_add_unique_to_name_of_post_statuses.rb @@ -0,0 +1,5 @@ +class AddUniqueToNameOfPostStatuses < ActiveRecord::Migration[6.0] + def change + add_index :post_statuses, :name, unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 875c27df..e415bd18 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_08_22_141109) do +ActiveRecord::Schema.define(version: 2019_08_24_093755) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -23,6 +23,14 @@ ActiveRecord::Schema.define(version: 2019_08_22_141109) do t.index ["name"], name: "index_boards_on_name", unique: true end + create_table "post_statuses", force: :cascade do |t| + t.string "name" + t.string "color" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["name"], name: "index_post_statuses_on_name", unique: true + end + create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false diff --git a/spec/factories/post_statuses.rb b/spec/factories/post_statuses.rb new file mode 100644 index 00000000..209dc666 --- /dev/null +++ b/spec/factories/post_statuses.rb @@ -0,0 +1,6 @@ +FactoryBot.define do + factory :post_status do + sequence(:name) { |n| "Post Status #{n}" } + color { "#ffffff" } + end +end diff --git a/spec/models/post_status_spec.rb b/spec/models/post_status_spec.rb new file mode 100644 index 00000000..4f344b80 --- /dev/null +++ b/spec/models/post_status_spec.rb @@ -0,0 +1,37 @@ +require 'rails_helper' + +RSpec.describe PostStatus, type: :model do + let(:post_status) { FactoryBot.create(:post_status) } + + it 'must have a name' do + emptyname = FactoryBot.build(:post_status, name: "") + nilname = FactoryBot.build(:post_status, name: nil) + + expect(emptyname.valid?).to be_falsy + expect(nilname.valid?).to be_falsy + expect(post_status.valid?).to be_truthy + end + + it 'has a unique name' do + post_status2 = FactoryBot.build(:post_status, name: post_status.name) + + expect(post_status2.valid?).to be_falsy + expect(post_status.valid?).to be_truthy + end + + it 'has a valid hex color' do + nilcolor = FactoryBot.build(:post_status, color: nil) + emptycolor = FactoryBot.build(:post_status, color: "") + invalidcolor = FactoryBot.build(:post_status, color: "ffffff") + invalidcolor2 = FactoryBot.build(:post_status, color: "#ffff") + validcolor = FactoryBot.build(:post_status, color: "#fff") + validcolor2 = FactoryBot.build(:post_status, color: "#ffffff") + + expect(nilcolor.valid?).to be_falsy + expect(emptycolor.valid?).to be_falsy + expect(invalidcolor.valid?).to be_falsy + expect(invalidcolor2.valid?).to be_falsy + expect(validcolor.valid?).to be_truthy + expect(validcolor2.valid?).to be_truthy + end +end