Add an initial implementation of the Event model
Initial implementation & specs of the Event model and its children
This commit is contained in:
parent
3316c06e42
commit
89de56d94d
|
@ -7,6 +7,7 @@ class Conference < ActiveRecord::Base
|
||||||
validate :end_date_is_before_start_date
|
validate :end_date_is_before_start_date
|
||||||
|
|
||||||
has_many :tracks
|
has_many :tracks
|
||||||
|
has_many :events, through: :tracks
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
class Event < ActiveRecord::Base
|
||||||
|
validates :title, presence: true
|
||||||
|
validates :length, presence: true, numericality: {only_integer: true, greater_than: 0}
|
||||||
|
validates :abstract, presence: true
|
||||||
|
validates :description, presence: true
|
||||||
|
|
||||||
|
belongs_to :track
|
||||||
|
has_one :conference, through: :track
|
||||||
|
belongs_to :user
|
||||||
|
end
|
|
@ -0,0 +1,3 @@
|
||||||
|
class Lecture < Event
|
||||||
|
validates :length, numericality: {greater_than_or_equal_to: 40, less_than_or_equal_to: 45}
|
||||||
|
end
|
|
@ -1,5 +1,6 @@
|
||||||
class Track < ActiveRecord::Base
|
class Track < ActiveRecord::Base
|
||||||
belongs_to :conference
|
belongs_to :conference
|
||||||
|
has_many :events
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates :color, presence: true, format: {with: /\A[a-f0-9]{6}\z/i}
|
validates :color, presence: true, format: {with: /\A[a-f0-9]{6}\z/i}
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
class Workshop < Event
|
||||||
|
validates :length, numericality: {greater_than_or_equal_to: 30, less_than_or_equal_to: 120}
|
||||||
|
end
|
|
@ -0,0 +1,20 @@
|
||||||
|
class CreateEvents < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :events do |t|
|
||||||
|
t.string :title, null: false
|
||||||
|
t.string :subtitle
|
||||||
|
t.string :type
|
||||||
|
t.integer :length, null: false, default: 45
|
||||||
|
t.string :language, null: false, default: 'bg_BG'
|
||||||
|
t.integer :state
|
||||||
|
t.text :abstract, null: false
|
||||||
|
t.text :description, null: false
|
||||||
|
t.text :notes
|
||||||
|
t.references :track, index: true
|
||||||
|
t.references :user, index: true
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
add_index :events, :type
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,27 @@
|
||||||
|
# Read about factories at https://github.com/thoughtbot/factory_girl
|
||||||
|
|
||||||
|
FactoryGirl.define do
|
||||||
|
factory :lecture do
|
||||||
|
title { |n| "Lecture #{n}" }
|
||||||
|
subtitle "Lorem Ipsum"
|
||||||
|
length 45
|
||||||
|
language "bg_BG"
|
||||||
|
abstract "An Abstract"
|
||||||
|
description "A Description"
|
||||||
|
notes "Some Notes"
|
||||||
|
track
|
||||||
|
user
|
||||||
|
end
|
||||||
|
|
||||||
|
factory :workshop do
|
||||||
|
title { |n| "Workshop #{n}" }
|
||||||
|
subtitle "Lorem Ipsum"
|
||||||
|
length 60
|
||||||
|
language "bg_BG"
|
||||||
|
abstract "An Abstract"
|
||||||
|
description "A Description"
|
||||||
|
notes "Some Notes"
|
||||||
|
track
|
||||||
|
user
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,23 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Lecture, :type => :model do
|
||||||
|
let(:event) { build :lecture }
|
||||||
|
|
||||||
|
it_behaves_like 'an event'
|
||||||
|
|
||||||
|
describe 'length' do
|
||||||
|
it 'must be between 40 and 45 minutes' do
|
||||||
|
event.length = 30
|
||||||
|
expect(event).to have_error_on :length
|
||||||
|
|
||||||
|
event.length = 60
|
||||||
|
expect(event).to have_error_on :length
|
||||||
|
|
||||||
|
event.length = 40
|
||||||
|
expect(event).to_not have_error_on :length
|
||||||
|
|
||||||
|
event.length = 45
|
||||||
|
expect(event).to_not have_error_on :length
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,23 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Workshop, :type => :model do
|
||||||
|
let(:event) { build :workshop }
|
||||||
|
|
||||||
|
it_behaves_like 'an event'
|
||||||
|
|
||||||
|
describe 'length' do
|
||||||
|
it 'must be between 30 and 120 minutes' do
|
||||||
|
event.length = 20
|
||||||
|
expect(event).to have_error_on :length
|
||||||
|
|
||||||
|
event.length = 240
|
||||||
|
expect(event).to have_error_on :length
|
||||||
|
|
||||||
|
event.length = 30
|
||||||
|
expect(event).to_not have_error_on :length
|
||||||
|
|
||||||
|
event.length = 120
|
||||||
|
expect(event).to_not have_error_on :length
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,33 @@
|
||||||
|
RSpec.shared_examples 'an event' do
|
||||||
|
it 'is invalid without a title' do
|
||||||
|
event.title = ''
|
||||||
|
expect(event).to have_error_on :title
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'length' do
|
||||||
|
it 'must be present' do
|
||||||
|
event.length = ''
|
||||||
|
expect(event).to have_error_on :length
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'must be a number' do
|
||||||
|
event.length = 'foo'
|
||||||
|
expect(event).to have_error_on :length
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'must be larger than zero' do
|
||||||
|
event.length = '-10'
|
||||||
|
expect(event).to have_error_on :length
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is invalid without an abstract' do
|
||||||
|
event.abstract = ''
|
||||||
|
expect(event).to have_error_on :abstract
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is invalid without a description' do
|
||||||
|
event.description = ''
|
||||||
|
expect(event).to have_error_on :description
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue