From 244172a9bce9586b3c37bf8852c130c77d866b5d Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Tue, 16 Aug 2016 19:02:59 +0200 Subject: [PATCH 1/8] Clean up DatabaseCleaner usage --- spec/spec_helper.rb | 11 +---------- spec/support/database_cleaner.rb | 8 -------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 3ee6db15..3b387199 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -55,15 +55,9 @@ RSpec.configure do |config| # --seed 1234 config.order = 'random' - # Setting up DB cleaning to maintain empty rows - config.before(:suite) do - DatabaseCleaner.strategy = :transaction - DatabaseCleaner.clean_with(:truncation) - end - config.around(:each) do |example| DatabaseCleaner.cleaning do - load "#{Rails.root}/db/seeds.rb" + Rails.application.load_seed example.run end end @@ -89,15 +83,12 @@ RSpec.configure do |config| c.syntax = :expect end - config.use_transactional_fixtures = true - # Reuse rspec as mocking framework config.mock_framework = :rspec # Types of tests (controller, feature, model) will # be inferred from subfolder name config.infer_spec_type_from_file_location! - end OmniAuth.config.test_mode = true diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb index e0dbc9aa..2d47903d 100644 --- a/spec/support/database_cleaner.rb +++ b/spec/support/database_cleaner.rb @@ -10,12 +10,4 @@ RSpec.configure do |config| config.before(:each, js: true) do DatabaseCleaner.strategy = :truncation end - - config.before(:each) do - DatabaseCleaner.start - end - - config.after(:each) do - DatabaseCleaner.clean - end end From baa5894c383df80f4f3e7de5fa4ea1625affa068 Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Tue, 16 Aug 2016 19:03:11 +0200 Subject: [PATCH 2/8] Don't use DBCleaner inside tests --- spec/models/user_spec.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 88bada1f..bf9e4362 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -348,9 +348,7 @@ describe User do describe 'assigns admin attribute' do it 'to second user when first user is deleted_user' do - DatabaseCleaner.clean_with(:truncation) - - deleted_user = create(:user, email: 'deleted@localhost.osem', name: 'User deleted') + deleted_user = User.find_by(email: 'deleted@localhost.osem') expect(deleted_user.is_admin).to be false user_after_deleted = create(:admin) @@ -360,8 +358,6 @@ describe User do describe 'does not assign admin attribute' do it 'when first user is not deleted_user' do - DatabaseCleaner.clean_with(:truncation) - first_user = create(:user) expect(first_user.is_admin).to be false From a6d4d51b03987d8608af500d20383b365f1e0474 Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Wed, 17 Aug 2016 18:49:00 +0200 Subject: [PATCH 3/8] Fix model specs to work with MySQL --- spec/models/campaign_spec.rb | 2 +- spec/models/conference_spec.rb | 4 ++-- spec/models/sponsorship_level_spec.rb | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/models/campaign_spec.rb b/spec/models/campaign_spec.rb index 0bf30aa5..4127371a 100644 --- a/spec/models/campaign_spec.rb +++ b/spec/models/campaign_spec.rb @@ -36,7 +36,7 @@ describe Campaign do campaign.conference = build(:conference) create(:visit, utm_source: 'google+', utm_medium: 'advertisement', - utm_term: 'opensource', utm_content: 'content', utm_campaign: '20percent', started_at: Time.now) + utm_term: 'opensource', utm_content: 'content', utm_campaign: '20percent', started_at: Time.now + 1.hour) expect(campaign.visits_count).to eq(1) end diff --git a/spec/models/conference_spec.rb b/spec/models/conference_spec.rb index e1ce4328..8aebc0cd 100755 --- a/spec/models/conference_spec.rb +++ b/spec/models/conference_spec.rb @@ -906,7 +906,7 @@ describe Conference do let!(:organizer) { create(:user, role_ids: [organizer_role.id]) } it 'self#event_distribution calculates correct values with user' do - create(:user, last_sign_in_at: Date.today - 3.months) # active + create(:user, last_sign_in_at: Date.today - 3.months + 1.day) # active create(:user, confirmed_at: nil) # unconfirmed create(:user, last_sign_in_at: Date.today - 1.year - 1.day) # dead result = {} @@ -918,7 +918,7 @@ describe Conference do end it 'self#event_distribution calculates correct with only active user' do - create(:user, last_sign_in_at: Date.today - 3.months) # active + create(:user, last_sign_in_at: Date.today - 3.months + 1.day) # active result = {} result['Active'] = { 'color' => 'green', 'value' => 1 } diff --git a/spec/models/sponsorship_level_spec.rb b/spec/models/sponsorship_level_spec.rb index 9ca74b47..2284d4ba 100644 --- a/spec/models/sponsorship_level_spec.rb +++ b/spec/models/sponsorship_level_spec.rb @@ -29,13 +29,13 @@ describe SponsorshipLevel do it 'is positions sponsorship_levels in order' do expect(SponsorshipLevel.where(conference_id: conference.id).order(:position).map(&:id)) - .to eq [2, 1, 3] + .to eq [@second_sponsorship_level.id, @first_sponsorship_level.id, @third_sponsorship_level.id] end it 'maintains order after deleting one element' do @first_sponsorship_level.destroy expect(SponsorshipLevel.where(conference_id: conference.id).order(:position).map(&:id)) - .to eq [2, 3] + .to eq [@second_sponsorship_level.id, @third_sponsorship_level.id] end end end From 686e41c3d008ef988f530973d708d8a936f1f3e6 Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Thu, 18 Aug 2016 11:58:58 +0200 Subject: [PATCH 4/8] Fix proposal controller specs to work with MySQL --- spec/controllers/proposal_controller_spec.rb | 47 ++++++++++---------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/spec/controllers/proposal_controller_spec.rb b/spec/controllers/proposal_controller_spec.rb index 15780f11..f6ea2b9c 100644 --- a/spec/controllers/proposal_controller_spec.rb +++ b/spec/controllers/proposal_controller_spec.rb @@ -4,6 +4,7 @@ describe ProposalController do let(:user) { create(:user) } let(:conference) { create(:conference, short_title: 'lama101') } let(:event) { create(:event, program: conference.program) } + let(:event_type) { create :event_type } context 'user is not signed in' do describe 'GET #new' do @@ -28,7 +29,7 @@ describe ProposalController do before { conference.program.update_attributes(cfp: create(:cfp)) } it 'assigns url variables' do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: attributes_for(:user) expect(assigns(:url)).to eq '/conference/lama101/program/proposal' @@ -38,7 +39,7 @@ describe ProposalController do describe 'user related actions' do before do @new_user = attributes_for(:user) - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: @new_user end @@ -55,7 +56,7 @@ describe ProposalController do context 'creates proposal successfully' do before(:each, run: true) do @new_user = attributes_for(:user) - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: @new_user end @@ -83,7 +84,7 @@ describe ProposalController do it 'creates new event' do expect do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: attributes_for(:user) end.to change{ Event.count }.by 1 @@ -93,7 +94,7 @@ describe ProposalController do context 'proposal save fails' do before(:each, run: true) do allow_any_instance_of(Event).to receive(:save).and_return(false) - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: attributes_for(:user) end @@ -109,7 +110,7 @@ describe ProposalController do it 'does not create new proposal' do allow_any_instance_of(Event).to receive(:save).and_return(false) expect do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: attributes_for(:user) end.not_to change{ Event.count } @@ -122,7 +123,7 @@ describe ProposalController do it 'does not create new user' do expect do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: attributes_for(:user) end.not_to change { User.count } @@ -130,7 +131,7 @@ describe ProposalController do it 'does not create new event' do expect do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: attributes_for(:user) end.not_to change { Event.count } @@ -138,7 +139,7 @@ describe ProposalController do describe 'response' do before do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title, user: attributes_for(:user) end @@ -213,7 +214,7 @@ describe ProposalController do it 'assigns event and url variables' do expect(assigns(:event)).to eq event - expect(assigns(:url)).to eq '/conference/lama101/program/proposal/1' + expect(assigns(:url)).to eq "/conference/lama101/program/proposal/#{event.id}" end it 'renders edit template' do @@ -226,14 +227,14 @@ describe ProposalController do before { conference.program.update_attributes(cfp: create(:cfp)) } it 'assigns url variables' do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title expect(assigns(:url)).to eq '/conference/lama101/program/proposal' end context 'creates proposal successfully' do before(:each, run: true) do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title end @@ -260,7 +261,7 @@ describe ProposalController do it 'creates new event' do expect do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title end.to change{ Event.count }.by 1 end @@ -269,7 +270,7 @@ describe ProposalController do context 'proposal save fails' do before(:each, run: true) do allow_any_instance_of(Event).to receive(:save).and_return(false) - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title end @@ -284,7 +285,7 @@ describe ProposalController do it 'does not create new proposal' do allow_any_instance_of(Event).to receive(:save).and_return(false) expect do - post :create, event: attributes_for(:event, event_type_id: 1), + post :create, event: attributes_for(:event, event_type_id: event_type.id), conference_id: conference.short_title end.not_to change{ Event.count } end @@ -294,15 +295,15 @@ describe ProposalController do describe 'PATCH #update' do it 'assigns url variable' do - patch :update, event: attributes_for(:event, title: 'some title', event_type_id: 1), + patch :update, event: attributes_for(:event, title: 'some title', event_type_id: event_type.id), conference_id: conference.short_title, id: event.id - expect(assigns(:url)).to eq '/conference/lama101/program/proposal/1' + expect(assigns(:url)).to eq "/conference/lama101/program/proposal/#{event.id}" end context 'updates successfully' do before do - patch :update, event: attributes_for(:event, title: 'some title', event_type_id: 1), + patch :update, event: attributes_for(:event, title: 'some title', event_type_id: event_type.id), conference_id: conference.short_title, id: event.id end @@ -324,7 +325,7 @@ describe ProposalController do context 'update fails' do before do allow_any_instance_of(Event).to receive(:save).and_return(false) - patch :update, event: attributes_for(:event, title: 'some title', event_type_id: 1), + patch :update, event: attributes_for(:event, title: 'some title', event_type_id: event_type.id), conference_id: conference.short_title, id: event.id end @@ -348,7 +349,7 @@ describe ProposalController do it 'assigns url variable' do patch :withdraw, conference_id: conference.short_title, id: event.id - expect(assigns(:url)).to eq '/conference/lama101/program/proposal/1' + expect(assigns(:url)).to eq "/conference/lama101/program/proposal/#{event.id}" end context 'withdraws successfully' do @@ -425,7 +426,7 @@ describe ProposalController do end it 'assigns url variable' do - expect(assigns(:url)).to eq '/conference/lama101/program/proposal/1' + expect(assigns(:url)).to eq "/conference/lama101/program/proposal/#{event.id}" end it 'change state of event to confirmed' do @@ -438,7 +439,7 @@ describe ProposalController do before { patch :confirm, conference_id: conference.short_title, id: event.id } it 'assigns url variable' do - expect(assigns(:url)).to eq '/conference/lama101/program/proposal/1' + expect(assigns(:url)).to eq "/conference/lama101/program/proposal/#{event.id}" end it 'change state of event to confirmed' do @@ -523,7 +524,7 @@ describe ProposalController do it 'assigns url variable' do patch :restart, conference_id: conference.short_title, id: event.id - expect(assigns(:url)).to eq '/conference/lama101/program/proposal/1' + expect(assigns(:url)).to eq "/conference/lama101/program/proposal/#{event.id}" end context 'resubmits successfully' do From 9eb4ac27387f72d28124388bf566e7d3af03b8ac Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Thu, 18 Aug 2016 13:23:48 +0200 Subject: [PATCH 5/8] Fix campaign features to work with MySQL --- app/views/admin/campaigns/index.html.haml | 12 ++++++------ spec/features/campaign_spec.rb | 17 +++++++---------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/app/views/admin/campaigns/index.html.haml b/app/views/admin/campaigns/index.html.haml index d368dcfd..25bc4605 100644 --- a/app/views/admin/campaigns/index.html.haml +++ b/app/views/admin/campaigns/index.html.haml @@ -18,13 +18,13 @@ %tbody - @campaigns.each do |campaign| %tr - %td{'id'=> "name_#{campaign.id}"} + %td.campaign-name{'id'=> "name_#{campaign.id}"} = campaign.name - %td{'id'=> "visits_#{campaign.id}"} + %td.campaign-visits{'id'=> "visits_#{campaign.id}"} = campaign.visits_count - %td{'id'=> "registrations_#{campaign.id}"} + %td.campaign-registrations{'id'=> "registrations_#{campaign.id}"} = campaign.registrations_count - %td{'id'=> "submissions_#{campaign.id}"} + %td.campaign-submissions{'id'=> "submissions_#{campaign.id}"} = campaign.submissions_count %td %a.copyLink{'href'=> '#', 'data-url'=>root_path + campaign.url_parameters} @@ -35,8 +35,8 @@ edit_admin_conference_campaign_path(@conference.short_title, campaign.id), class: 'btn btn-primary' = link_to 'Delete', - admin_conference_campaign_path(@conference.short_title, campaign.id), - method: :delete, class: 'btn btn-danger', data: { confirm: "Do you really want to delete the campaign #{campaign.name}?" } + admin_conference_campaign_path(@conference.short_title, campaign.id), + method: :delete, class: 'btn btn-danger', data: { confirm: "Do you really want to delete the campaign #{campaign.name}?" } .row .col-md-12 = link_to 'New Campaign', new_admin_conference_campaign_path, class: 'btn btn-success pull-right' diff --git a/spec/features/campaign_spec.rb b/spec/features/campaign_spec.rb index d7018279..c2191341 100644 --- a/spec/features/campaign_spec.rb +++ b/spec/features/campaign_spec.rb @@ -17,8 +17,7 @@ feature Campaign do click_button 'Create Campaign' - expect(flash). - to eq("Campaign creation failed. Name can't be blank and Utm campaign can't be blank") + expect(flash).to eq("Campaign creation failed. Name can't be blank and Utm campaign can't be blank") fill_in 'campaign_name', with: 'Test Campaign' fill_in 'campaign_utm_campaign', with: 'campaign' @@ -30,13 +29,12 @@ feature Campaign do click_button 'Create Campaign' # Validations - expect(flash). - to eq('Campaign successfully created.') + expect(flash).to eq('Campaign successfully created.') - expect(find('#name_1').text).to eq('Test Campaign') - expect(find('#visits_1').text).to eq('0') - expect(find('#registrations_1').text).to eq('0') - expect(find('#submissions_1').text).to eq('0') + expect(page).to have_selector('.campaign-name', text: 'Test Campaign') + expect(page).to have_selector('.campaign-visits', text: '0') + expect(page).to have_selector('.campaign-registrations', text: '0') + expect(page).to have_selector('.campaign-submissions', text: '0') expect(Campaign.count).to eq(expected_count) @@ -45,8 +43,7 @@ feature Campaign do fill_in 'campaign_name', with: 'Test Campaign 42' click_button 'Update Campaign' - expect(flash). - to eq("Campaign 'Test Campaign 42' successfully updated.") + expect(flash).to eq("Campaign 'Test Campaign 42' successfully updated.") end end From 4d6868d9bb84a5a0628def6bd5650ecf36bb3abe Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Thu, 18 Aug 2016 16:21:09 +0200 Subject: [PATCH 6/8] Fix conference serializer spec to work with MySQL --- Gemfile | 2 + Gemfile.lock | 3 + .../serializers/conference_serializer_spec.rb | 83 ++------------ spec/support/api_schema_matcher.rb | 9 ++ spec/support/schemas/conference.json | 101 ++++++++++++++++++ 5 files changed, 125 insertions(+), 73 deletions(-) create mode 100644 spec/support/api_schema_matcher.rb create mode 100644 spec/support/schemas/conference.json diff --git a/Gemfile b/Gemfile index 5a1cae6e..c4564a2b 100644 --- a/Gemfile +++ b/Gemfile @@ -227,6 +227,8 @@ group :test do gem 'webmock' # for mocking Stripe responses in tests gem 'stripe-ruby-mock' + # For validating JSON schemas + gem 'json-schema' end group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index 98196af8..2f84aa81 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -230,6 +230,8 @@ GEM jquery-ui-rails (4.2.1) railties (>= 3.2.16) json (1.8.3) + json-schema (2.5.0) + addressable (~> 2.3) jwt (1.0.0) launchy (2.4.2) addressable (~> 2.3) @@ -577,6 +579,7 @@ DEPENDENCIES jquery-datatables-rails (~> 2.2.1) jquery-rails jquery-ui-rails (~> 4.2.1) + json-schema leaflet-rails letter_opener letter_opener_web diff --git a/spec/serializers/conference_serializer_spec.rb b/spec/serializers/conference_serializer_spec.rb index 20c28f7f..851c6518 100644 --- a/spec/serializers/conference_serializer_spec.rb +++ b/spec/serializers/conference_serializer_spec.rb @@ -1,4 +1,5 @@ require 'spec_helper' + describe ConferenceSerializer, type: :serializer do let(:conference) do create(:conference, short_title: 'goto', @@ -8,84 +9,20 @@ describe ConferenceSerializer, type: :serializer do end let(:serializer) { ConferenceSerializer.new(conference) } - let(:expected_hash) do - { - conference: { - short_title: 'goto', - title: conference.title, - description: 'Lorem ipsum dolor sit', - start_date: '2014-03-04', - end_date: '2014-03-10', - picture_url: nil, - difficulty_levels: - [{id: 1, - title: 'Easy', - description: 'Events are understandable for everyone without knowledge of the topic.' - }, - {id: 2, - title: 'Medium', - description: 'Events require a basic understanding of the topic.' - }, - {id: 3, - title: 'Hard', - description: 'Events require expert knowledge of the topic.' - } - ], - event_types: - [{id: 1, - title: 'Talk', - length: 30, - description: 'Presentation in lecture format' - }, - {id: 2, - title: 'Workshop', - length: 60, - description: 'Interactive hands-on practice' - } - ], - rooms: [], - tracks: [], - date_range: 'March 04 - 10', - revision: 1 - } - } - end - context 'conference does not have rooms and tracks' do - it 'sets conference attributes with empty room and tracks' do - expect(serializer.to_json).to eq expected_hash.to_json + context 'when the conference does not have rooms and tracks' do + it 'correctly serializes the conference' do + expect(serializer.to_json).to match_response_schema('conference') end end - context 'conference has rooms and tracks' do - before do - venue = create(:venue, conference: conference) - _room = create(:room, venue: venue) - track = create(:track, program: conference.program) + context 'when the conference has rooms and tracks' do + let(:venue) { create(:venue, conference: conference) } + let!(:room) { create(:room, venue: venue) } + let!(:track) { create(:track, program: conference.program) } - room_hash = { - rooms: [{ - id: 1, - size: 4, - events: [] - } - ] - } - track_hash = { - tracks: [{ - id: 1, - name: track.name, - description: track.description - } - ] - } - - expected_hash[:conference].merge! room_hash - expected_hash[:conference].merge! track_hash - end - - it 'sets conference attributes with rooms and tracks' do - expect(serializer.to_json).to eq expected_hash.to_json + it 'correctly serializes the conference' do + expect(serializer.to_json).to match_response_schema('conference') end end end diff --git a/spec/support/api_schema_matcher.rb b/spec/support/api_schema_matcher.rb new file mode 100644 index 00000000..4da6bfe6 --- /dev/null +++ b/spec/support/api_schema_matcher.rb @@ -0,0 +1,9 @@ +# Source: https://robots.thoughtbot.com/validating-json-schemas-with-an-rspec-matcher + +RSpec::Matchers.define :match_response_schema do |schema| + match do |json| + schema_directory = "#{Dir.pwd}/spec/support/schemas" + schema_path = "#{schema_directory}/#{schema}.json" + JSON::Validator.validate!(schema_path, json, strict: true) + end +end diff --git a/spec/support/schemas/conference.json b/spec/support/schemas/conference.json new file mode 100644 index 00000000..3117d98f --- /dev/null +++ b/spec/support/schemas/conference.json @@ -0,0 +1,101 @@ +{ + "type": "object", + "required": ["conference"], + "properties": { + "conference" : { + "type" : "object", + "required" : [ + "short_title", + "title", + "description", + "start_date", + "end_date", + "picture_url", + "difficulty_levels", + "event_types", + "rooms", + "tracks", + "date_range", + "revision" + ], + "properties" : { + "short_title": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "start_date": { + "type": "string", "format": "date" + }, + "end_date": { + "type": "string", "format": "date" + }, + "picture_url": { + "anyOf": [ + { "type": "string" }, + { "type": "null" } + ] + }, + "difficulty_levels": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "title", "description"], + "properties": { + "id": { "type": "integer" }, + "title": { "type": "string" }, + "description": { "type": "string" } + } + } + }, + "event_types": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "title", "description", "length"], + "properties": { + "id": { "type": "integer" }, + "title": { "type": "string" }, + "description": { "type": "string" }, + "length": { "type": "integer" } + } + } + }, + "rooms": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "size", "events"], + "properties": { + "id": { "type": "integer" }, + "size": { "type": "integer" }, + "events": { "type": "array" } + } + } + }, + "tracks": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "name", "description"], + "properties": { + "id": { "type": "integer" }, + "name": { "type": "string" }, + "description": { "type": "string" } + } + } + }, + "date_range": { + "type": "string" + }, + "revision": { + "type": "integer" + } + } + } + } +} From 393deefcf9f617a77476bdd9dc60eceeb1f28d1a Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Mon, 22 Aug 2016 11:23:18 +0200 Subject: [PATCH 7/8] Use a css regex matcher to find campaign entries --- app/views/admin/campaigns/index.html.haml | 8 ++++---- spec/features/campaign_spec.rb | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/views/admin/campaigns/index.html.haml b/app/views/admin/campaigns/index.html.haml index 25bc4605..97e29dd8 100644 --- a/app/views/admin/campaigns/index.html.haml +++ b/app/views/admin/campaigns/index.html.haml @@ -18,13 +18,13 @@ %tbody - @campaigns.each do |campaign| %tr - %td.campaign-name{'id'=> "name_#{campaign.id}"} + %td{'id'=> "name_#{campaign.id}"} = campaign.name - %td.campaign-visits{'id'=> "visits_#{campaign.id}"} + %td{'id'=> "visits_#{campaign.id}"} = campaign.visits_count - %td.campaign-registrations{'id'=> "registrations_#{campaign.id}"} + %td{'id'=> "registrations_#{campaign.id}"} = campaign.registrations_count - %td.campaign-submissions{'id'=> "submissions_#{campaign.id}"} + %td{'id'=> "submissions_#{campaign.id}"} = campaign.submissions_count %td %a.copyLink{'href'=> '#', 'data-url'=>root_path + campaign.url_parameters} diff --git a/spec/features/campaign_spec.rb b/spec/features/campaign_spec.rb index c2191341..c2fa8de6 100644 --- a/spec/features/campaign_spec.rb +++ b/spec/features/campaign_spec.rb @@ -31,10 +31,10 @@ feature Campaign do # Validations expect(flash).to eq('Campaign successfully created.') - expect(page).to have_selector('.campaign-name', text: 'Test Campaign') - expect(page).to have_selector('.campaign-visits', text: '0') - expect(page).to have_selector('.campaign-registrations', text: '0') - expect(page).to have_selector('.campaign-submissions', text: '0') + expect(page).to have_selector('[id^="name_"]', text: 'Test Campaign') + expect(page).to have_selector('[id^="visits_"]', text: '0') + expect(page).to have_selector('[id^="registrations_"]', text: '0') + expect(page).to have_selector('[id^="submissions_"]', text: '0') expect(Campaign.count).to eq(expected_count) From 1eaf810548c75c1517639df24cf318f8f3e715e2 Mon Sep 17 00:00:00 2001 From: Hernan Schmidt Date: Mon, 22 Aug 2016 16:39:19 +0200 Subject: [PATCH 8/8] In Travis, run tests on MariaDB --- .travis.yml | 5 ++++- config/database.yml.travis | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 config/database.yml.travis diff --git a/.travis.yml b/.travis.yml index 10af790e..ae8030b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,8 @@ rvm: before_install: - "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc" - "echo `phantomjs -v`" +addons: + mariadb: '10.1' notifications: email: on_success: change @@ -17,8 +19,9 @@ notifications: on_success: change on_failure: change before_script: - - cp config/database.yml.example config/database.yml + - cp config/database.yml.travis config/database.yml - cp config/secrets.yml.example config/secrets.yml + - mysql -u root -e 'create database osem_test;' - RAILS_ENV=test bundle exec rake db:migrate --trace script: - 'bundle exec rubocop -Dc .rubocop.yml' diff --git a/config/database.yml.travis b/config/database.yml.travis new file mode 100644 index 00000000..c0410217 --- /dev/null +++ b/config/database.yml.travis @@ -0,0 +1,5 @@ +test: + adapter: mysql2 + database: osem_test + username: root + encoding: utf8