diff --git a/Gemfile b/Gemfile index 12d2b6d..b6c654e 100644 --- a/Gemfile +++ b/Gemfile @@ -20,6 +20,9 @@ group :development, :test do gem 'rspec-rails', '~> 2.0' gem 'capybara-webkit' gem 'capybara' + gem 'fabrication' + gem 'database_cleaner' + gem 'pry-debugger' gem 'git-duet' gem 'dotenv' end @@ -27,6 +30,8 @@ end group :development do gem 'git-pair' gem 'pry' + gem 'quiet_assets' + gem 'annotate', ">=2.5.0" gem 'rails-erd' end @@ -35,5 +40,6 @@ group :doc do end group :test do + gem 'fivemat' gem 'simplecov', require: false end diff --git a/Gemfile.lock b/Gemfile.lock index a479304..8130429 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -26,6 +26,8 @@ GEM thread_safe (~> 0.1) tzinfo (~> 0.3.37) angularjs-rails (1.0.7) + annotate (2.5.0) + rake arel (4.0.0) atomic (1.1.10) builder (3.1.4) @@ -47,13 +49,23 @@ GEM coffee-script-source execjs coffee-script-source (1.6.2) + columnize (0.3.6) + database_cleaner (1.1.1) + debugger (1.6.2) + columnize (>= 0.3.1) + debugger-linecache (~> 1.2.0) + debugger-ruby_core_source (~> 1.2.3) + debugger-linecache (1.2.0) + debugger-ruby_core_source (1.2.3) diff-lcs (1.2.1) dotenv (0.9.0) erubis (2.7.0) execjs (1.4.0) multi_json (~> 1.0) + fabrication (2.8.0) faraday (0.8.8) multipart-post (~> 1.2.0) + fivemat (1.2.1) git-duet (0.1.3) git-pair (0.1.0) haml (4.0.3) @@ -107,8 +119,13 @@ GEM coderay (~> 1.0.5) method_source (~> 0.8) slop (~> 3.4) + pry-debugger (0.2.2) + debugger (~> 1.3) + pry (~> 0.9.10) puma (2.6.0) rack (>= 1.1, < 2.0) + quiet_assets (1.0.2) + railties (>= 3.1, < 5.0) rack (1.5.2) rack-test (0.6.2) rack (>= 1.0) @@ -188,10 +205,14 @@ PLATFORMS DEPENDENCIES angularjs-rails + annotate (>= 2.5.0) capybara capybara-webkit coffee-rails (~> 4.0.0) + database_cleaner dotenv + fabrication + fivemat git-duet git-pair haml-rails (~> 0.4) @@ -200,7 +221,9 @@ DEPENDENCIES omniauth-github pg pry + pry-debugger puma (~> 2.6.0) + quiet_assets rails (= 4.0.0) rails-erd rspec-rails (~> 2.0) diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 69c0710..65102f9 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,5 +1,5 @@ class EventsController < ApplicationController - before_action :find_event, only: [ :edit, :show ] + before_action :find_event, only: [ :edit, :show, :update ] before_action :event_params, only: [ :update ] def index @@ -7,25 +7,34 @@ def index end def new - end - - def edit + @event = Event.new end def show end def create + @event = current_user.events.new event_params + if current_user.save + flash[:notice] = 'Successfully created' + redirect_to events_path + else + flash[:error] = 'Something went wrong' + render new_event_path + end end - def update + def edit @event = Event.find(params[:id]) - if @event.update_attributes(@params) - flash[:notice] = "Event updated successfully" + end + + def update + if @event.update event_params + flash[:notice] = "Event updated successfully" redirect_to events_path else - flash[:notice] = "Event wasn't updated as expected" - redirect_to :back + flash[:notice] = "Event wasn't updated as expected" + render :edit end end @@ -33,13 +42,12 @@ def destroy end private + def event_params - @params = params.require(:event).permit(:name, :details, :location) + @params = params.require(:event).permit! end def find_event - @event = Event.find(params[:id]) - end - - + @event = Event.find(params[:id]) + end end diff --git a/app/models/event.rb b/app/models/event.rb index e6a471f..5e764cd 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -1,3 +1,23 @@ +# == Schema Information +# +# Table name: events +# +# id :integer not null, primary key +# name :string(255) +# details :text +# user_id :integer +# latitude :string(255) +# longitude :string(255) +# location_name :string(255) +# scheduled_at :datetime +# created_at :datetime +# updated_at :datetime +# + class Event < ActiveRecord::Base - validates_presence_of :name, :details, :user_id + belongs_to :user + validates_presence_of :name, :user_id + + # Note: Make sure that this doesn't conflict with ActiveRecord + attr_accessor :where end diff --git a/app/models/user.rb b/app/models/user.rb index fa31b6b..c5da68c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,5 @@ class User < ActiveRecord::Base + has_many :events def self.create_with_omniauth auth create! do |user| diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index c1c0186..9163bb8 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -2,14 +2,14 @@ .name = event.name %span - %em + %em created by: = event.user_id publish date: = event.created_at.strftime('%y/%d/%m') .details = event.details - + = link_to 'Edit', edit_event_path(event) = link_to 'Show', event_path(event) = link_to 'Back', events_path diff --git a/app/views/events/_form.html.haml b/app/views/events/_form.html.haml index 08cf8cd..8fefc1f 100644 --- a/app/views/events/_form.html.haml +++ b/app/views/events/_form.html.haml @@ -1,9 +1,20 @@ = render partial: 'layouts/error_messages', locals: { resource: @event} + = form_for @event do |f| - = f.label :name - = f.text_field :name - = f.label :details - = f.text_area :details - = f.label :location - = f.text_field :location_name - = f.submit + %p + = f.label :event_name + = f.text_field :event_name + %p + = f.label :information + = f.text_area :information_details + %p + = f.label :location_name + = f.text_field :location_name + %p + = f.label :where + = f.text_field :where + %p + = f.label :when + = f.text_field :scheduled_at + %p + = f.submit diff --git a/app/views/home/show.html.haml b/app/views/home/show.html.haml index 6c8fdc8..51d8000 100644 --- a/app/views/home/show.html.haml +++ b/app/views/home/show.html.haml @@ -1,2 +1,2 @@ %h1 Hackd.mx -%p This is a dummy home page +%p This is a dummy home page diff --git a/config/application.rb b/config/application.rb index 34ee5b8..ccfe08f 100644 --- a/config/application.rb +++ b/config/application.rb @@ -5,7 +5,6 @@ # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(:default, Rails.env) - module Hackd class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. @@ -15,6 +14,7 @@ class Application < Rails::Application # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' + #config.quiet_assets = false # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] diff --git a/config/initializers/fabrication.rb b/config/initializers/fabrication.rb new file mode 100644 index 0000000..0eb0711 --- /dev/null +++ b/config/initializers/fabrication.rb @@ -0,0 +1,5 @@ +Fabrication.configure do |config| + config.fabricator_path = 'spec/fabricators' + config.path_prefix = Rails.root + config.sequence_start = 10000 +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 91719ab..5f6605a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,3 +10,18 @@ root to: 'events#index' end +#== Route Map +# Generated on 16 Sep 2013 18:00 +# +# github_callback GET /auth/github/callback(.:format) sessions#create +# sessions POST /sessions(.:format) sessions#create +# session DELETE /sessions/:id(.:format) sessions#destroy +# events GET /events(.:format) events#index +# POST /events(.:format) events#create +# new_event GET /events/new(.:format) events#new +# edit_event GET /events/:id/edit(.:format) events#edit +# event GET /events/:id(.:format) events#show +# PATCH /events/:id(.:format) events#update +# PUT /events/:id(.:format) events#update +# DELETE /events/:id(.:format) events#destroy +# root GET / events#index diff --git a/db/schema.rb b/db/schema.rb index dadce79..65a9fac 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -13,9 +13,6 @@ ActiveRecord::Schema.define(version: 20131017021425) do - # These are extensions that must be enabled in order to support this database - enable_extension "plpgsql" - create_table "events", force: true do |t| t.string "name" t.text "details" diff --git a/spec/controllers/events_controller_spec.rb b/spec/controllers/events_controller_spec.rb index b78af62..7d43408 100644 --- a/spec/controllers/events_controller_spec.rb +++ b/spec/controllers/events_controller_spec.rb @@ -1,5 +1,102 @@ require 'spec_helper' describe EventsController do - pending + def valid_attributes + { + name: 'test', + details: 'test', + location_name: 'test_location' + } + end + let(:event){ Fabricate :event } + let(:user){ event.user } + + before do + controller.stub(:current_user).and_return user + end + + describe 'GET #index' do + it 'responds successfully with an HTTP 200 status code' do + get :index + + expect(response).to be_success + expect(response.status).to eq(200) + end + + it 'renders the index template' do + get :index + + expect(response).to render_template('index') + end + + it 'loads all of the events into @events' do + event1, event2 = Fabricate(:event), Fabricate(:event) + + get :index + + expect(assigns(:events)).to include(event1, event2) + end + end + + describe '#new' do + before do + get :new + end + + it 'responds successfully with an HTTP 200 status code' do + expect(response).to be_success + expect(response.status).to eq(200) + end + + it 'renders the new template' do + expect(response).to render_template("new") + end + end + + describe '#create' do + context 'when success' do + it 'redirects to events index' do + post :create, { event: valid_attributes } + + expect(response).to redirect_to events_path + end + end + + context 'when is invalid' do + it 'should not redirect to events index' do + post :create, { event: { name: ''} } + + expect(response).to render_template 'new' + end + end + end + + describe '#edit' do + it' should edit a event' do + get :edit, { id: event.to_param } + + expect(response).to render_template("edit") + end + end + + describe '#update' do + context 'valid information' do + it 'redirects to index page' do + put :update, { event: event.attributes, id: event.to_param } + + expect(response).to redirect_to events_path + end + end + + context 'invalid information' do + it 'renders the edit page' do + params = { id: event.to_param, event: { name: nil } } + put :update, params + + expect(response).to render_template("edit") + end + end + + end + end diff --git a/spec/fabricators/event_fabricator.rb b/spec/fabricators/event_fabricator.rb new file mode 100644 index 0000000..e80a0e2 --- /dev/null +++ b/spec/fabricators/event_fabricator.rb @@ -0,0 +1,4 @@ +Fabricator :event do + name 'Event x' + user { Fabricate :user } +end diff --git a/spec/fabricators/user_fabricator.rb b/spec/fabricators/user_fabricator.rb new file mode 100644 index 0000000..276c1a1 --- /dev/null +++ b/spec/fabricators/user_fabricator.rb @@ -0,0 +1,6 @@ +Fabricator :user do + email { sequence { |n| "user_#{n}@example.com" } } + first_name 'Jane' + last_name 'Doe' + gender 'female' +end diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb index ec309cc..464f87a 100644 --- a/spec/helpers/events_helper_spec.rb +++ b/spec/helpers/events_helper_spec.rb @@ -11,5 +11,4 @@ # end # end describe EventsHelper do - pending "add some examples to (or delete) #{__FILE__}" end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index efb7dd5..aca76cc 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -1,5 +1,29 @@ require 'spec_helper' describe Event do - pending "add some examples to (or delete) #{__FILE__}" + context 'validations' do + context 'when missing required fields' do + it 'should return a list of validation errors' do + full_error_messages = [ + "Name can't be blank", + "User can't be blank" + ] + + subject.should_not be_valid + + subject.errors.full_messages.should eql full_error_messages + end + end + + context 'when all required fields are given' do + it 'should have no errors' do + subject.name = 'First meeting' + subject.user_id = 1 + + subject.should be_valid + + subject.errors.empty?.should be_true + end + end + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b6a1dfa..3995c8b 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,6 @@ require 'capybara/rspec' require 'simplecov' +require 'database_cleaner' SimpleCov.start 'rails' ENV["RAILS_ENV"] ||= 'test' @@ -13,6 +14,10 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} +DatabaseCleaner.strategy = :truncation + +DatabaseCleaner.clean + ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) RSpec.configure do |config|