diff --git a/.gitignore b/.gitignore index 64f5e1ff..a0223dec 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ set_aws_credentials.sh # Ignore map images uploaded to Locations /locations public/sitemap.xml.gz +profiles diff --git a/.rspec b/.rspec new file mode 100644 index 00000000..83e16f80 --- /dev/null +++ b/.rspec @@ -0,0 +1,2 @@ +--color +--require spec_helper diff --git a/.ruby-version b/.ruby-version index 58594069..2bf1c1cc 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.2.3 +2.3.1 diff --git a/Gemfile b/Gemfile index 22598fd7..e7de37c9 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'rails' +gem 'rails', '4.2.5' # Storage gem 'aws-sdk', '~> 1.50' @@ -10,12 +10,12 @@ gem 'paperclip', '~> 4.2.0' gem 'rmagick', '2.13.4' # Authentication -gem 'devise' gem 'bcrypt' +gem 'devise' # Design -gem 'sass-rails' gem 'material_icons' +gem 'sass-rails' # Quality of Life gem 'cocoon' @@ -42,11 +42,8 @@ gem 'chartkick' gem 'slack-notifier' group :production do - # gem 'less-rails' - # gem 'less-rails-fontawesome' - gem 'uglifier', '>= 1.3.0' - # gem 'bootplus-rails' gem 'rails_12factor' + gem 'uglifier', '>= 1.3.0' end group :test, :production do @@ -54,25 +51,27 @@ group :test, :production do gem 'therubyracer', platforms: :ruby end -group :test, :development do +group :test do + gem 'better_errors' + gem 'binding_of_caller' gem 'capybara' - gem 'selenium-webdriver' + gem 'codeclimate-test-reporter', require: false gem 'coveralls', require: false - gem 'simplecov', require: false - gem 'rubocop', require: false gem 'cucumber-rails', require: false gem 'database_cleaner' - - gem 'sqlite3' - gem 'tzinfo-data' # addresses a bug when working on Windows - gem 'factory_girl_rails' gem 'guard' gem 'guard-minitest' gem 'guard-rubocop' gem 'pry' - gem 'better_errors' - gem 'binding_of_caller' + gem 'selenium-webdriver' + gem 'simplecov', require: false + gem 'sqlite3' + gem 'tzinfo-data' # addresses a bug when working on Windows gem 'rails-perftest' - gem 'ruby-prof' + gem 'rspec-prof' + gem 'rspec-rails' + gem 'rubocop', require: false + gem 'ruby-prof', '0.15.9' + gem 'shoulda-matchers', '~> 3.1' end diff --git a/Gemfile.lock b/Gemfile.lock index ca482812..4ec7397e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,36 +7,36 @@ GIT GEM remote: https://rubygems.org/ specs: - actionmailer (4.2.0) - actionpack (= 4.2.0) - actionview (= 4.2.0) - activejob (= 4.2.0) + actionmailer (4.2.5) + actionpack (= 4.2.5) + actionview (= 4.2.5) + activejob (= 4.2.5) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.0) - actionview (= 4.2.0) - activesupport (= 4.2.0) - rack (~> 1.6.0) + actionpack (4.2.5) + actionview (= 4.2.5) + activesupport (= 4.2.5) + rack (~> 1.6) rack-test (~> 0.6.2) rails-dom-testing (~> 1.0, >= 1.0.5) - rails-html-sanitizer (~> 1.0, >= 1.0.1) - actionview (4.2.0) - activesupport (= 4.2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (4.2.5) + activesupport (= 4.2.5) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) - rails-html-sanitizer (~> 1.0, >= 1.0.1) - activejob (4.2.0) - activesupport (= 4.2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + activejob (4.2.5) + activesupport (= 4.2.5) globalid (>= 0.3.0) - activemodel (4.2.0) - activesupport (= 4.2.0) + activemodel (4.2.5) + activesupport (= 4.2.5) builder (~> 3.1) - activerecord (4.2.0) - activemodel (= 4.2.0) - activesupport (= 4.2.0) + activerecord (4.2.5) + activemodel (= 4.2.5) + activesupport (= 4.2.5) arel (~> 6.0) - activesupport (4.2.0) + activesupport (4.2.5) i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) @@ -44,7 +44,7 @@ GEM tzinfo (~> 1.1) addressable (2.4.0) arel (6.0.3) - ast (2.2.0) + ast (2.3.0) aws-sdk (1.66.0) aws-sdk-v1 (= 1.66.0) aws-sdk-v1 (1.66.0) @@ -58,7 +58,7 @@ GEM binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) builder (3.2.2) - capybara (2.6.2) + capybara (2.9.2) addressable mime-types (>= 1.16) nokogiri (>= 1.3.3) @@ -73,20 +73,23 @@ GEM cocaine (0.5.8) climate_control (>= 0.0.3, < 1.0) cocoon (1.2.9) + codeclimate-test-reporter (0.6.0) + simplecov (>= 0.7.1, < 1.0.0) coderay (1.1.1) - coffee-rails (4.0.1) + coffee-rails (4.2.1) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.0) + railties (>= 4.0.0, < 5.2.x) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.10.0) - coveralls (0.8.13) - json (~> 1.8) - simplecov (~> 0.11.0) + concurrent-ruby (1.0.2) + coveralls (0.8.15) + json (>= 1.8, < 3) + simplecov (~> 0.12.0) term-ansicolor (~> 1.3) thor (~> 0.19.1) - tins (~> 1.6.0) + tins (>= 1.6.0, < 2) cucumber (2.4.0) builder (>= 2.1.2) cucumber-core (~> 1.5.0) @@ -97,41 +100,40 @@ GEM multi_test (>= 0.1.2) cucumber-core (1.5.0) gherkin (~> 4.0) - cucumber-rails (1.4.3) + cucumber-rails (1.4.5) capybara (>= 1.1.2, < 3) - cucumber (>= 1.3.8, < 3) + cucumber (>= 1.3.8, < 4) mime-types (>= 1.16, < 4) nokogiri (~> 1.5) - railties (>= 3, < 5) + railties (>= 3, < 5.1) cucumber-wire (0.0.1) database_cleaner (1.5.3) dateslices (0.0.4) rails (> 4) debug_inspector (0.0.2) - devise (3.5.6) + devise (4.2.0) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 3.2.6, < 5) + railties (>= 4.1.0, < 5.1) responders - thread_safe (~> 0.1) warden (~> 1.2.3) diff-lcs (1.2.5) docile (1.1.5) erubis (2.7.0) - execjs (2.6.0) + execjs (2.7.0) factory_girl (4.7.0) activesupport (>= 3.0.0) factory_girl_rails (4.7.0) factory_girl (~> 4.7.0) railties (>= 3.0.0) - ffi (1.9.10) + ffi (1.9.14) formatador (0.2.5) gherkin (4.0.0) - globalid (0.3.6) + globalid (0.3.7) activesupport (>= 4.1.0) - guard (2.13.0) + guard (2.14.0) formatador (>= 0.2.4) - listen (>= 2.7, <= 4.0) + listen (>= 2.7, < 4.0) lumberjack (~> 1.0) nenv (~> 0.1) notiffany (~> 0.0) @@ -139,25 +141,25 @@ GEM shellany (~> 0.0) thor (>= 0.18.1) guard-compat (1.2.1) - guard-minitest (2.4.4) + guard-minitest (2.4.6) guard-compat (~> 1.2) minitest (>= 3.0) guard-rubocop (1.2.0) guard (~> 2.0) rubocop (~> 0.20) - hike (1.2.3) i18n (0.7.0) - jquery-rails (4.1.1) + jquery-rails (4.2.1) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) jquery-ui-rails (5.0.5) railties (>= 3.2.16) json (1.8.3) - libv8 (3.16.14.13) - listen (3.0.6) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9.7) + libv8 (3.16.14.15) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) loofah (2.0.3) nokogiri (>= 1.5.9) lumberjack (1.0.10) @@ -165,22 +167,23 @@ GEM mime-types (>= 1.16, < 4) material_icons (2.2.0) railties (>= 3.2) - medium-editor-rails (2.2.0) + medium-editor-rails (2.3.1) railties (>= 3.0) - meta-tags (2.2.0) - actionpack (>= 3.2.0) + meta-tags (2.3.1) + actionpack (>= 3.2.0, <= 5.1.0) method_source (0.8.2) - mime-types (3.0) + mime-types (3.1) mime-types-data (~> 3.2015) - mime-types-data (3.2016.0221) - mini_portile2 (2.0.0) - minitest (5.8.4) - multi_json (1.11.2) + mime-types-data (3.2016.0521) + mini_portile2 (2.1.0) + minitest (5.9.1) + multi_json (1.12.1) multi_test (0.1.2) nenv (0.3.0) - nokogiri (1.6.7.2) - mini_portile2 (~> 2.0.0.rc2) - notiffany (0.0.8) + nokogiri (1.6.8) + mini_portile2 (~> 2.1.0) + pkg-config (~> 1.1.7) + notiffany (0.1.1) nenv (~> 0.1) shellany (~> 0.0) orm_adapter (0.5.0) @@ -189,27 +192,28 @@ GEM activesupport (>= 3.2.0) cocaine (~> 0.5.5) mime-types - parser (2.3.0.7) + parser (2.3.1.4) ast (~> 2.2) - pg (0.18.4) + pg (0.19.0) + pkg-config (1.1.7) powerpack (0.1.1) - pry (0.10.3) + pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) - rails (4.2.0) - actionmailer (= 4.2.0) - actionpack (= 4.2.0) - actionview (= 4.2.0) - activejob (= 4.2.0) - activemodel (= 4.2.0) - activerecord (= 4.2.0) - activesupport (= 4.2.0) + rails (4.2.5) + actionmailer (= 4.2.5) + actionpack (= 4.2.5) + actionview (= 4.2.5) + activejob (= 4.2.5) + activemodel (= 4.2.5) + activerecord (= 4.2.5) + activesupport (= 4.2.5) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.0) + railties (= 4.2.5) sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) @@ -225,75 +229,101 @@ GEM rails_12factor (0.0.3) rails_serve_static_assets rails_stdout_logging - rails_serve_static_assets (0.0.4) - rails_stdout_logging (0.0.4) - railties (4.2.0) - actionpack (= 4.2.0) - activesupport (= 4.2.0) + rails_serve_static_assets (0.0.5) + rails_stdout_logging (0.0.5) + railties (4.2.5) + actionpack (= 4.2.5) + activesupport (= 4.2.5) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rainbow (2.1.0) - rake (11.1.2) + rake (11.3.0) rb-fsevent (0.9.7) rb-inotify (0.9.7) ffi (>= 0.5.0) ref (2.0.0) - responders (2.1.2) + responders (2.3.0) railties (>= 4.2.0, < 5.1) rmagick (2.13.4) - rubocop (0.39.0) - parser (>= 2.3.0.7, < 3.0) + rspec (3.5.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-core (3.5.4) + rspec-support (~> 3.5.0) + rspec-expectations (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-mocks (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-prof (0.0.7) + rspec (~> 3.0) + ruby-prof + rspec-rails (3.5.2) + actionpack (>= 3.0) + activesupport (>= 3.0) + railties (>= 3.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-support (~> 3.5.0) + rspec-support (3.5.0) + rubocop (0.43.0) + parser (>= 2.3.1.1, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.7) unicode-display_width (~> 1.0, >= 1.0.1) ruby-prof (0.15.9) - ruby-progressbar (1.7.5) + ruby-progressbar (1.8.1) + ruby_dep (1.4.0) rubyzip (1.2.0) - sass (3.2.19) - sass-rails (4.0.5) - railties (>= 4.0.0, < 5.0) - sass (~> 3.2.2) - sprockets (~> 2.8, < 3.0) - sprockets-rails (~> 2.0) - selenium-webdriver (2.53.0) + sass (3.4.22) + sass-rails (5.0.6) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + selenium-webdriver (2.53.4) childprocess (~> 0.5) rubyzip (~> 1.0) websocket (~> 1.0) shellany (0.0.1) - simplecov (0.11.2) + shoulda-matchers (3.1.1) + activesupport (>= 4.0.0) + simplecov (0.12.0) docile (~> 1.1.0) - json (~> 1.8) + json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) slack-notifier (1.5.1) slop (3.6.0) - sprockets (2.12.4) - hike (~> 1.2) - multi_json (~> 1.0) - rack (~> 1.0) - tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.3.3) - actionpack (>= 3.0) - activesupport (>= 3.0) - sprockets (>= 2.8, < 4.0) + sprockets (3.7.0) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.0) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) sqlite3 (1.3.11) - term-ansicolor (1.3.2) + term-ansicolor (1.4.0) tins (~> 1.0) therubyracer (0.12.2) libv8 (~> 3.16.14.0) ref thor (0.19.1) thread_safe (0.3.5) - tilt (1.4.1) - tins (1.6.0) + tilt (2.0.5) + tins (1.12.0) tzinfo (1.2.2) thread_safe (~> 0.1) - tzinfo-data (1.2016.3) + tzinfo-data (1.2016.7) tzinfo (>= 1.0.0) - uglifier (3.0.0) + uglifier (3.0.2) execjs (>= 0.3.0, < 3) - unicode-display_width (1.0.3) + unicode-display_width (1.1.1) warden (1.2.6) rack (>= 1.0) websocket (1.2.3) @@ -311,6 +341,7 @@ DEPENDENCIES capybara chartkick cocoon + codeclimate-test-reporter coffee-rails coveralls cucumber-rails @@ -329,16 +360,19 @@ DEPENDENCIES paperclip (~> 4.2.0) pg pry - rails + rails (= 4.2.5) rails-jquery-autocomplete rails-perftest rails_12factor rmagick (= 2.13.4) + rspec-prof + rspec-rails rubocop - ruby-prof + ruby-prof (= 0.15.9) sass-rails selenium-webdriver serendipitous! + shoulda-matchers (~> 3.1) simplecov slack-notifier sqlite3 @@ -347,4 +381,4 @@ DEPENDENCIES uglifier (>= 1.3.0) BUNDLED WITH - 1.13.1 + 1.13.2 diff --git a/README.rdoc b/README.rdoc index cd103b01..ff87b821 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,6 +1,7 @@ = notebook {Build Status}[https://travis-ci.org/indentlabs/notebook] -{Coverage Status}[https://coveralls.io/r/indentlabs/notebook?branch=master] +{}[https://codeclimate.com/github/indentlabs/notebook] +{}[https://codeclimate.com/github/indentlabs/notebook/coverage] {Inline docs}[http://inch-ci.org/github/indentlabs/notebook] == What is notebook? @@ -40,13 +41,13 @@ Install curl Install rvm \curl -sSL https://get.rvm.io | bash - + source ~/.rvm/scripts/rvm Install ruby 2.1.2 rvm install ruby 2.1.2 - + rvm use 2.1.2 Install rails 4.0.1 @@ -76,8 +77,8 @@ Optional: To enable the uploading and editing of images (used in Locations manag And then set your AWS credentials with source set_aws_credentials.rb - -Finally, run the server with + +Finally, run the server with rails server diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 799f039f..7265d3c6 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -16,9 +16,21 @@ class ApplicationController < ActionController::Base before_action do if current_user && session[:universe_id] @universe_scope = Universe.find_by(user: current_user, id: session[:universe_id]) + else + @universe_scope = nil end end + before_action do + @page_title ||= '' + @page_keywords ||= %w[writing author nanowrimo novel character fiction fantasy universe creative dnd roleplay larp game design] + @page_description ||= 'Notebook is a set of tools for writers, game designers, and roleplayers to create magnificent universes — and everything within them.' + end + + before_action do + @question ||= '' + end + def content_type_from_controller(content_controller_name) content_controller_name.to_s.chomp('Controller').singularize.constantize end diff --git a/app/views/cards/serendipitous/_content_question.html.erb b/app/views/cards/serendipitous/_content_question.html.erb index dca14a9f..f8a8f9f3 100644 --- a/app/views/cards/serendipitous/_content_question.html.erb +++ b/app/views/cards/serendipitous/_content_question.html.erb @@ -1,25 +1,19 @@ -<% if question && question[:field] && question[:question].present? %> +<% +if question.present? && + question[:field].present? && + question[:question].present? && + content.present? +%>
<%= content.class.icon %> <%= question[:question] %> <%= form_for content do |f| %> - <% - value = content.send(question[:field]) - if value.is_a?(ActiveRecord::Associations::CollectionProxy) - klass = value.first.class || value.build.class - %> - <%# render 'content/form/relation_input', f: f, attribute: question[:field].chomp('ship').pluralize, relation: question[:field].chomp('ships').pluralize %> - <% - else - %> -
- <%= f.text_field question[:field], class: 'content-question-input' %> - <%= f.label content.class.human_attribute_name(question[:field]) %> -
- <% - end - %> + +
+ <%= f.text_field question[:field], class: 'content-question-input' %> + <%= f.label content.class.human_attribute_name(question[:field]) %> +
<%# Using a plain old form.submit creates a button that only responds to a click on the button text, not anywhere else on the button. %> diff --git a/config/environments/test.rb b/config/environments/test.rb index c228c40d..dbb0aaa5 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -37,5 +37,5 @@ Rails.application.configure do config.active_record.raise_in_transactional_callbacks = true - default_url_options[:host] = 'localhost:3000' + default_url_options[:host] = 'test.host' end diff --git a/features/accounts.feature b/features/accounts.feature new file mode 100644 index 00000000..b01230cf --- /dev/null +++ b/features/accounts.feature @@ -0,0 +1,16 @@ +Feature: User accounts + + Scenario: I sign up + When I sign up + Then I should see my dashboard + + Scenario: I log in as an existing user + Given I have an account + When I log in + Then I should see my dashboard + + Scenario: I log out, and then log in + When I sign up + Then I log out + Then I log in + Then I should see my dashboard diff --git a/features/content.feature b/features/content.feature new file mode 100644 index 00000000..a6f5701e --- /dev/null +++ b/features/content.feature @@ -0,0 +1,31 @@ +Feature: Character sheets + As an author, + I want to record information about the content I create + So that I don't forget + + Background: + Given I have an account + And I log in + + Scenario Outline: I create new content + When I create a + Then that should be saved + + Examples: + | content_type | + | character | + | location | + | item | + | universe | + + Scenario Outline: I change my content's name + Given I have created a + When I change my 's name + Then that new name should be saved + + Examples: + | content_type | + | character | + | location | + | item | + | universe | diff --git a/features/serendipitous_cards.feature b/features/serendipitous_cards.feature new file mode 100644 index 00000000..ef67a78d --- /dev/null +++ b/features/serendipitous_cards.feature @@ -0,0 +1,8 @@ +Feature: Serendipitous cards + + Scenario: I update character info using a serendipitous card + Given I am logged-in + And I create a character + When I view that character + And I answer the Serendipitous question + Then that new field should be saved diff --git a/features/step_definitions/.gitkeep b/features/step_definitions/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/features/step_definitions/steps.rb b/features/step_definitions/steps.rb new file mode 100644 index 00000000..d2db7923 --- /dev/null +++ b/features/step_definitions/steps.rb @@ -0,0 +1,82 @@ +When 'I sign up' do + @user = build(:user) + + visit new_user_registration_path + fill_in 'user_name', with: 'User Name' + fill_in 'user_email', with: @user.email + fill_in 'user_password', with: 'password' + fill_in 'user_password_confirmation', with: 'password' + click_button 'Sign up' + + @user = User.where(email: @user.email).first +end + +Given 'I have an account' do + step('I sign up') +end + +When 'I log in' do + step('I log out') + visit new_user_session_path + fill_in 'user_email', with: @user.email + fill_in 'user_password', with: 'password' + click_button 'Log in' +end + +Given 'I am logged-in' do + step('I sign up') +end + +When 'I log out' do + visit destroy_user_session_path +end + +Then 'I should see my dashboard' do + expect(current_path).to eq(dashboard_path) +end + +When(/^I create a (character|location|item|universe)$/) do |model| + visit new_polymorphic_path(model) + fill_in "#{model}_name", with: 'My new content' + click_on "Create #{model.titlecase}" + @model = model.classify.constantize.where(name: 'My new content', user: @user).first +end + +Then(/^that (character|location|item|universe) should be saved$/) do |model| + expect(@user.send(model.pluralize).length).to eq(1) +end + +Given(/^I have created a (character|location|item|universe)$/) do |model| + @model = create(model.to_sym, user: @user) +end + +When(/^I change my (character|location|item|universe)\'s name$/) do |model| + visit polymorphic_path(@model) + click_on "Edit this #{model}" + fill_in "#{model}_name", with: 'My changed name' + click_on "Update #{model.titlecase}" + @model.reload +end + +When(/^I view that (character|location|item|universe)$/) do |_model| + visit polymorphic_path(@model) +end + +Then(/^that new name should be saved$/) do + expect(@model.name).to eq('My changed name') +end + +When 'I answer the Serendipitous question' do + @modified_field_name = find(:css, '.content-question-input')[:id].split('_', 2)[1] + @model[@modified_field_name] = 'Previous Value' + @model.save + @previous_field_value = @model[@modified_field_name] + + find(:css, '.content-question-input').set('Content Question Answer') + find('.content-question-submit').click +end + +Then 'that new field should be saved' do + @model.reload + expect(@model[@modified_field_name]).to eq('Content Question Answer') +end diff --git a/features/support/factory_girl.rb b/features/support/factory_girl.rb new file mode 100644 index 00000000..139fbe01 --- /dev/null +++ b/features/support/factory_girl.rb @@ -0,0 +1 @@ +World(FactoryGirl::Syntax::Methods) diff --git a/features/users/user_create.feature b/features/users/user_create.feature deleted file mode 100644 index 5eb15cba..00000000 --- a/features/users/user_create.feature +++ /dev/null @@ -1,17 +0,0 @@ -Feature: User account creation - As user of the site - I want to sign up to the website - So that, at a later date, I can access the content that I previously created - - @wip - Scenario: A new user saves some content - When I sign up - And I create some content - And I log out - And I log in - Then I should see the content that I created - - @wip - Scenario: A user signs up and gets a confirmation email - When I sign up - Then I should get an email diff --git a/spec/controllers/admin_controller_spec.rb b/spec/controllers/admin_controller_spec.rb new file mode 100644 index 00000000..d30d93ee --- /dev/null +++ b/spec/controllers/admin_controller_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' +require 'support/devise' + +RSpec.describe AdminController, type: :controller do + describe 'GET #dashboard' do + before { get :dashboard } + it { is_expected.to respond_with(200) } + end + + describe 'GET #universes' do + before { get :universes } + it { is_expected.to respond_with(200) } + end + + describe 'GET #characters' do + before { get :characters } + it { is_expected.to respond_with(200) } + end + + describe 'GET #locations' do + before { get :locations } + it { is_expected.to respond_with(200) } + end + + describe 'GET #items' do + before { get :items } + it { is_expected.to respond_with(200) } + end +end diff --git a/spec/controllers/characters_controller_spec.rb b/spec/controllers/characters_controller_spec.rb new file mode 100644 index 00000000..0954fcbc --- /dev/null +++ b/spec/controllers/characters_controller_spec.rb @@ -0,0 +1,7 @@ +require 'rails_helper' +require 'support/devise' +require 'support/content_controller_example' + +RSpec.describe CharactersController, type: :controller do + it_behaves_like 'a controller for a content item' +end diff --git a/spec/controllers/characters_generator_controller_spec.rb b/spec/controllers/characters_generator_controller_spec.rb new file mode 100644 index 00000000..b7bffa76 --- /dev/null +++ b/spec/controllers/characters_generator_controller_spec.rb @@ -0,0 +1,182 @@ +require 'rails_helper' +require 'support/devise' + +RSpec.describe CharactersGeneratorController, type: :controller do + describe 'GET #age' do + before { get :age } + it { is_expected.to respond_with(200) } + + describe 'assigns(:lower_limit)' do + subject { assigns(:lower_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be <= assigns(:upper_limit) } + end + + describe 'assigns(:upper_limit)' do + subject { assigns(:upper_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be >= assigns(:lower_limit) } + end + end + + describe 'GET #bodytype' do + before { get :bodytype } + it { is_expected.to respond_with(200) } + + describe 'assigns(:possible_types)' do + subject { assigns(:possible_types) } + it { is_expected.to_not be_empty } + end + end + + describe 'GET #eyecolor' do + before { get :eyecolor } + it { is_expected.to respond_with(200) } + + describe 'assigns(:possible_colors)' do + subject { assigns(:possible_colors) } + it { is_expected.to_not be_empty } + end + end + + describe 'GET #facialhair' do + before { get :facialhair } + it { is_expected.to respond_with(200) } + + describe 'assigns(:possible_types)' do + subject { assigns(:possible_styles) } + it { is_expected.to_not be_empty } + end + end + + describe 'GET #haircolor' do + before { get :haircolor } + it { is_expected.to respond_with(200) } + + describe 'assigns(:possible_colors)' do + subject { assigns(:possible_colors) } + it { is_expected.to_not be_empty } + end + end + + describe 'GET #hairstyle' do + before { get :hairstyle } + it { is_expected.to respond_with(200) } + + describe 'assigns(:possible_styles)' do + subject { assigns(:possible_styles) } + it { is_expected.to_not be_empty } + end + end + + describe 'GET #height' do + before { get :height } + it { is_expected.to respond_with(200) } + + describe 'assigns(:lower_foot_limit)' do + subject { assigns(:lower_foot_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be >= 0 } + it { is_expected.to be <= assigns(:upper_foot_limit) } + end + + describe 'assigns(:upper_foot_limit)' do + subject { assigns(:upper_foot_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be >= 0 } + it { is_expected.to be >= assigns(:lower_foot_limit) } + end + + describe 'assigns(:lower_inch_limit)' do + subject { assigns(:lower_inch_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be >= 0 } + it { is_expected.to be <= assigns(:upper_inch_limit) } + end + + describe 'assigns(:upper_inch_limit)' do + subject { assigns(:upper_inch_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be >= 0 } + it { is_expected.to be >= assigns(:lower_inch_limit) } + end + end + + describe 'GET #identifyingmark' do + before { get :identifyingmark } + it { is_expected.to respond_with(200) } + + describe 'assigns(:possible_marks)' do + subject { assigns(:possible_marks) } + it { is_expected.to_not be_nil } + end + + describe 'assigns(:possible_locations)' do + subject { assigns(:possible_locations) } + it { is_expected.to_not be_nil } + end + end + + describe 'GET #name' do + before { get :name } + it { is_expected.to respond_with(200) } + + describe 'assigns(:male_first_names)' do + subject { assigns(:male_first_names) } + it { is_expected.to_not be_empty } + end + + describe 'assigns(:female_first_names)' do + subject { assigns(:female_first_names) } + it { is_expected.to_not be_empty } + end + + describe 'assigns(:last_names)' do + subject { assigns(:last_names) } + it { is_expected.to_not be_empty } + end + + describe 'assigns(:all_first_names)' do + subject { assigns(:all_first_names) } + it { is_expected.to_not be_empty } + end + + describe 'assigns(:all_last_names)' do + subject { assigns(:all_last_names) } + it { is_expected.to_not be_empty } + end + end + + describe 'GET #race' do + before { get :race } + it { is_expected.to respond_with(200) } + + describe 'assigns(:possible_races)' do + subject { assigns(:possible_races) } + it { is_expected.to_not be_empty } + end + end + + describe 'GET #skintone' do + before { get :bodytype } + it { is_expected.to respond_with(200) } + end + + describe 'GET #weight' do + before { get :weight } + it { is_expected.to respond_with(200) } + + describe 'assigns(:lower_limit)' do + subject { assigns(:lower_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be > 0 } + it { is_expected.to be <= assigns(:upper_limit) } + end + + describe 'assigns(:upper_limit)' do + subject { assigns(:upper_limit) } + it { is_expected.to be_an(Integer) } + it { is_expected.to be >= assigns(:lower_limit) } + end + end +end diff --git a/spec/controllers/equipment_generator_controller_spec.rb b/spec/controllers/equipment_generator_controller_spec.rb new file mode 100644 index 00000000..9035e927 --- /dev/null +++ b/spec/controllers/equipment_generator_controller_spec.rb @@ -0,0 +1,48 @@ +require 'rails_helper' +require 'support/generated_lists_example' + +RSpec.describe EquipmentGeneratorController, type: :controller do + it_behaves_like 'a generator', :shield_types do + before { get :armor_shield } + end + + it_behaves_like 'a generator', :weapon_types do + before { get :weapon } + end + + it_behaves_like 'a generator', :axe_types do + before { get :weapon_axe } + end + + it_behaves_like 'a generator', :bow_types do + before { get :weapon_bow } + end + + it_behaves_like 'a generator', :club_types do + before { get :weapon_club } + end + + it_behaves_like 'a generator', :fist_weapon_types do + before { get :weapon_fist } + end + + it_behaves_like 'a generator', :flexible_types do + before { get :weapon_flexible } + end + + it_behaves_like 'a generator', :thrown_types do + before { get :weapon_thrown } + end + + it_behaves_like 'a generator', :polearm_types do + before { get :weapon_polearm } + end + + it_behaves_like 'a generator', :shortsword_types do + before { get :weapon_shortsword } + end + + it_behaves_like 'a generator', :sword_types do + before { get :weapon_sword } + end +end diff --git a/spec/controllers/items_controller_spec.rb b/spec/controllers/items_controller_spec.rb new file mode 100644 index 00000000..d8b0eeab --- /dev/null +++ b/spec/controllers/items_controller_spec.rb @@ -0,0 +1,7 @@ +require 'rails_helper' +require 'support/devise' +require 'support/content_controller_example' + +RSpec.describe ItemsController, type: :controller do + it_behaves_like 'a controller for a content item' +end diff --git a/spec/controllers/locations_controller_spec.rb b/spec/controllers/locations_controller_spec.rb new file mode 100644 index 00000000..92810a5b --- /dev/null +++ b/spec/controllers/locations_controller_spec.rb @@ -0,0 +1,7 @@ +require 'rails_helper' +require 'support/devise' +require 'support/content_controller_example' + +RSpec.describe LocationsController, type: :controller do + it_behaves_like 'a controller for a content item' +end diff --git a/spec/controllers/locations_generator_controller_spec.rb b/spec/controllers/locations_generator_controller_spec.rb new file mode 100644 index 00000000..6aa76b53 --- /dev/null +++ b/spec/controllers/locations_generator_controller_spec.rb @@ -0,0 +1,55 @@ +require 'rails_helper' +require 'support/devise' + +RSpec.describe LocationsGeneratorController, type: :controller do + describe 'GET #name' do + before { get :name } + + it { is_expected.to respond_with(200) } + + describe 'assigns(:root_name)' do + subject { assigns(:root_name) } + it { is_expected.to_not be_blank } + end + + describe 'assigns(:prefix_occurrence)' do + subject { assigns(:prefix_occurrence) } + it { is_expected.to_not be_blank } + it { is_expected.to be_between(0, 1).inclusive } + end + + describe 'assigns(:postfix_occurrence)' do + subject { assigns(:postfix_occurrence) } + it { is_expected.to_not be_blank } + it { is_expected.to be_between(0, 1).inclusive } + end + + describe 'assigns(:syllables_upper_limit)' do + subject { assigns(:syllables_upper_limit) } + it { is_expected.to_not be_blank } + it { is_expected.to be >= assigns(:syllables_lower_limit) } + end + + describe 'assigns(:syllables_lower_limit)' do + subject { assigns(:syllables_lower_limit) } + it { is_expected.to_not be_blank } + it { is_expected.to be >= 0 } + it { is_expected.to be <= assigns(:syllables_upper_limit) } + end + + describe 'assigns(:prefixes)' do + subject { assigns(:prefixes) } + it { is_expected.to_not be_blank } + end + + describe 'assigns(:postfixes)' do + subject { assigns(:postfixes) } + it { is_expected.to_not be_blank } + end + + describe 'assigns(:syllables)' do + subject { assigns(:syllables) } + it { is_expected.to_not be_blank } + end + end +end diff --git a/spec/controllers/main_controller_spec.rb b/spec/controllers/main_controller_spec.rb new file mode 100644 index 00000000..61c80a38 --- /dev/null +++ b/spec/controllers/main_controller_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' +require 'support/devise' + +RSpec.describe MainController, type: :controller do + describe 'GET #index' do + before { get :index } + it { is_expected.to respond_with(200) } + end +end diff --git a/spec/controllers/universes_controller_spec.rb b/spec/controllers/universes_controller_spec.rb new file mode 100644 index 00000000..8725a9f9 --- /dev/null +++ b/spec/controllers/universes_controller_spec.rb @@ -0,0 +1,7 @@ +require 'rails_helper' +require 'support/devise' +require 'support/content_controller_example' + +RSpec.describe UniversesController, type: :controller do + it_behaves_like 'a controller for a content item' +end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb new file mode 100644 index 00000000..7d0080fa --- /dev/null +++ b/spec/controllers/users_controller_spec.rb @@ -0,0 +1,14 @@ +require 'rails_helper' +require 'support/devise' + +RSpec.describe UsersController, type: :controller do + let(:user) { create(:user) } + + describe 'GET #show/:id' do + it 'responds successfully with an HTTP 200 status code' do + get :show, id: user.id + expect(response).to be_success + expect(response).to have_http_status(200) + end + end +end diff --git a/spec/controllers/write_controller_spec.rb b/spec/controllers/write_controller_spec.rb new file mode 100644 index 00000000..96e5a479 --- /dev/null +++ b/spec/controllers/write_controller_spec.rb @@ -0,0 +1,17 @@ +require 'rails_helper' +require 'support/devise' + +RSpec.describe WriteController, type: :controller do + describe 'GET #editor, scene_id: 1' do + before do + @request.env['devise.mapping'] = Devise.mappings[:user] + @user = create(:user) + + sign_in @user + + get :editor, scene_id: 1 + end + + it { is_expected.to respond_with(200) } + end +end diff --git a/test/factories.rb b/spec/factories.rb similarity index 87% rename from test/factories.rb rename to spec/factories.rb index a0d050c1..6d7fae46 100644 --- a/test/factories.rb +++ b/spec/factories.rb @@ -1,8 +1,10 @@ FactoryGirl.define do + sequence :email do |n| + "email#{n}@example.com" + end + factory :user do - sequence :email do |n| - "user#{n}@example.com" - end + email password 'password' end diff --git a/spec/models/character_spec.rb b/spec/models/character_spec.rb new file mode 100644 index 00000000..65b8b1bc --- /dev/null +++ b/spec/models/character_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' +require 'support/privacy_example' +require 'support/public_scope_example' + +RSpec.describe Character, type: :model do + it_behaves_like 'content with privacy' + it_behaves_like 'content with an is_public scope' + it { is_expected.to validate_presence_of(:name) } +end diff --git a/spec/models/item_spec.rb b/spec/models/item_spec.rb new file mode 100644 index 00000000..d634b289 --- /dev/null +++ b/spec/models/item_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' +require 'support/privacy_example' +require 'support/public_scope_example' + +RSpec.describe Item, type: :model do + it_behaves_like 'content with privacy' + it_behaves_like 'content with an is_public scope' + it { is_expected.to validate_presence_of(:name) } +end diff --git a/spec/models/location_spec.rb b/spec/models/location_spec.rb new file mode 100644 index 00000000..54f14d97 --- /dev/null +++ b/spec/models/location_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' +require 'support/privacy_example' +require 'support/public_scope_example' + +RSpec.describe Location, type: :model do + it_behaves_like 'content with privacy' + it_behaves_like 'content with an is_public scope' + it { is_expected.to validate_presence_of(:name) } +end diff --git a/spec/models/universe_spec.rb b/spec/models/universe_spec.rb new file mode 100644 index 00000000..d8795243 --- /dev/null +++ b/spec/models/universe_spec.rb @@ -0,0 +1,8 @@ +require 'rails_helper' +require 'support/privacy_example' +require 'support/public_scope_example' + +RSpec.describe Universe, type: :model do + it_behaves_like 'content with privacy' + it { is_expected.to validate_presence_of(:name) } +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb new file mode 100644 index 00000000..9d5ad872 --- /dev/null +++ b/spec/models/user_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +RSpec.describe User, type: :model do + context "when user's email is profile.image.test@example.com" do + let(:user) { build(:user, email: 'profile.image.test@example.com') } + + describe '.image_url' do + subject { user.image_url } + it { is_expected.to match('https://www.gravatar.com/avatar/d2fd00e79c471f49c33b6bcb6b08d08d') } + end + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb new file mode 100644 index 00000000..a05f8867 --- /dev/null +++ b/spec/rails_helper.rb @@ -0,0 +1,66 @@ +# This file is copied to spec/ when you run 'rails generate rspec:install' +ENV['RAILS_ENV'] ||= 'test' +require File.expand_path('../../config/environment', __FILE__) +# Prevent database truncation if the environment is production +abort('The Rails environment is running in production mode!') if Rails.env.production? +require 'spec_helper' +require 'rspec/rails' +# Add additional requires below this line. Rails is not loaded until this point! + +# Requires supporting ruby files with custom matchers and macros, etc, in +# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are +# run as spec files by default. This means that files in spec/support that end +# in _spec.rb will both be required and run as specs, causing the specs to be +# run twice. It is recommended that you do not name files matching this glob to +# end with _spec.rb. You can configure this pattern with the --pattern +# option on the command line or in ~/.rspec, .rspec or `.rspec-local`. +# +# The following line is provided for convenience purposes. It has the downside +# of increasing the boot-up time by auto-requiring all files in the support +# directory. Alternatively, in the individual `*_spec.rb` files, manually +# require only the support files necessary. +# +# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } + +# Checks for pending migration and applies them before tests are run. +# If you are not using ActiveRecord, you can remove this line. +ActiveRecord::Migration.maintain_test_schema! + +RSpec.configure do |config| + # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures + # config.fixture_path = "#{::Rails.root}/spec/fixtures" + + # If you're not using ActiveRecord, or you'd prefer not to run each of your + # examples within a transaction, remove the following line or assign false + # instead of true. + # config.use_transactional_fixtures = true + + # RSpec Rails can automatically mix in different behaviours to your tests + # based on their file location, for example enabling you to call `get` and + # `post` in specs under `spec/controllers`. + # + # You can disable this behaviour by removing the line below, and instead + # explicitly tag your specs with their type, e.g.: + # + # RSpec.describe UsersController, :type => :controller do + # # ... + # end + # + # The different available types are documented in the features, such as in + # https://relishapp.com/rspec/rspec-rails/docs + config.infer_spec_type_from_file_location! + + # Filter lines from Rails gems in backtraces. + config.filter_rails_from_backtrace! + # arbitrary gems may also be filtered via: + # config.filter_gems_from_backtrace("gem name") + + config.include FactoryGirl::Syntax::Methods +end + +Shoulda::Matchers.configure do |config| + config.integrate do |with| + with.test_framework :rspec + with.library :rails + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 00000000..3fa37d35 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,111 @@ +# This file was generated by the `rails generate rspec:install` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# The `.rspec` file also contains a few flags that are not defaults but that +# users commonly want. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +require 'codeclimate-test-reporter' +CodeClimate::TestReporter.start + +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + + # The settings below are suggested to provide a good initial experience + # with RSpec, but feel free to customize to your heart's content. + # # This allows you to limit a spec run to individual examples or groups + # # you care about by tagging them with `:focus` metadata. When nothing + # # is tagged with `:focus`, all examples get run. RSpec also provides + # # aliases for `it`, `describe`, and `context` that include `:focus` + # # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + # config.filter_run_when_matching :focus + # + # # Allows RSpec to persist some state between runs in order to support + # # the `--only-failures` and `--next-failure` CLI options. We recommend + # # you configure your source control system to ignore this file. + # config.example_status_persistence_file_path = "spec/examples.txt" + # + # # Limits the available syntax to the non-monkey patched syntax that is + # # recommended. For more details, see: + # # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ + # # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode + # config.disable_monkey_patching! + # + # # Many RSpec users commonly either run the entire suite or an individual + # # file, and it's useful to allow more verbose output when running an + # # individual spec file. + # if config.files_to_run.one? + # # Use the documentation formatter for detailed output, + # # unless a formatter has already been configured + # # (e.g. via a command-line flag). + # config.default_formatter = 'doc' + # end + # + # # Print the 10 slowest examples and example groups at the + # # end of the spec run, to help surface which specs are running + # # particularly slow. + # config.profile_examples = 10 + # + # # Run specs in random order to surface order dependencies. If you find an + # # order dependency and want to debug it, you can fix the order by providing + # # the seed, which is printed after each run. + # # --seed 1234 + # config.order = :random + # + # # Seed global randomization in this process using the `--seed` CLI option. + # # Setting this allows you to use `--seed` to deterministically reproduce + # # test failures related to randomization by passing the same `--seed` value + # # as the one that triggered the failure. + # Kernel.srand config.seed + + config.before(:suite) do + DatabaseCleaner.strategy = :transaction + DatabaseCleaner.clean_with(:truncation) + end + + config.around(:each) do |example| + DatabaseCleaner.cleaning do + example.run + end + end +end diff --git a/spec/support/content_controller_example.rb b/spec/support/content_controller_example.rb new file mode 100644 index 00000000..7fc7519e --- /dev/null +++ b/spec/support/content_controller_example.rb @@ -0,0 +1,70 @@ +require 'rails_helper' +require 'support/devise' +include Rails.application.routes.url_helpers + +shared_examples_for 'a controller for a content item' do + before(:all) do + @model_class = described_class.controller_name.classify.constantize + @model_name = described_class.controller_name.classify.constantize.model_name.param_key + end + + before(:each) do + @request.env['devise.mapping'] = Devise.mappings[:user] + @user = create(:user) + + sign_in @user + end + + let(:model) { create(@model_name.to_sym, user: @user) } + + describe 'GET #index' do + before { get :index } + it { is_expected.to respond_with(200) } + it { is_expected.to render_template('content/index') } + + describe 'assigns(:content)' do + subject { assigns(:content) } + it { is_expected.to_not be_nil } + end + end + + describe 'GET #new' do + before { get :new } + it { is_expected.to respond_with(200) } + it { is_expected.to render_template("#{@model_name.pluralize}/new") } + end + + describe 'POST #create' do + before do + post :create, @model_name => { + name: model.name + } + end + it { is_expected.to redirect_to(polymorphic_path(assigns(:content))) } + end + + describe 'GET #edit' do + before { get :edit, id: model.id } + it { is_expected.to respond_with(200) } + it { is_expected.to render_template("#{@model_name.pluralize}/edit") } + end + + describe 'PUT #update' do + before do + put :update, id: model.id, @model_name => { + name: model.name + } + end + it { is_expected.to redirect_to(polymorphic_path(model)) } + end + + describe 'DELETE #destroy' do + before { delete :destroy, id: model.id } + it { is_expected.to redirect_to(polymorphic_path(@model_class)) } + + describe 'the destroyed model' do + subject { @model_class.find_by_id(model.id) } + it { is_expected.to be_nil } + end + end +end diff --git a/spec/support/devise.rb b/spec/support/devise.rb new file mode 100644 index 00000000..f81e29d2 --- /dev/null +++ b/spec/support/devise.rb @@ -0,0 +1,5 @@ +require 'devise' + +RSpec.configure do |config| + config.include Devise::Test::ControllerHelpers, type: :controller +end diff --git a/spec/support/generated_lists_example.rb b/spec/support/generated_lists_example.rb new file mode 100644 index 00000000..ba05a7ef --- /dev/null +++ b/spec/support/generated_lists_example.rb @@ -0,0 +1,9 @@ +require 'rails_helper' + +shared_examples_for 'a generator' do |types| + it { is_expected.to respond_with(200) } + + it "assigns #{types}" do + expect(assigns(types)).to_not be_empty + end +end diff --git a/spec/support/privacy_example.rb b/spec/support/privacy_example.rb new file mode 100644 index 00000000..3ed9e39c --- /dev/null +++ b/spec/support/privacy_example.rb @@ -0,0 +1,17 @@ +require 'rails_helper' + +shared_examples_for 'content with privacy' do + context 'model is public' do + let(:model) do + build( + described_class.model_name.param_key.to_sym, + privacy: 'public' + ) + end + + describe '.public_content?' do + subject { model.public_content? } + it { is_expected.to be true } + end + end +end diff --git a/spec/support/public_scope_example.rb b/spec/support/public_scope_example.rb new file mode 100644 index 00000000..ead3f19a --- /dev/null +++ b/spec/support/public_scope_example.rb @@ -0,0 +1,71 @@ +require 'rails_helper' + +shared_examples_for 'content with an is_public scope' do + context 'when model is in a public universe' do + let(:universe) { create(:universe, privacy: 'public') } + + context 'when model is private' do + let(:model) do + create( + described_class.model_name.param_key.to_sym, + universe: universe, + privacy: 'private' + ) + end + + describe '#is_public' do + subject { described_class.is_public } + it { is_expected.to include(model) } + end + end + + context 'when model is public' do + let(:model) do + create( + described_class.model_name.param_key.to_sym, + universe: universe, + privacy: 'public' + ) + end + + describe '#is_public' do + subject { described_class.is_public } + it { is_expected.to include(model) } + end + end + end + + context 'when model is in a private universe' do + let(:universe) { build(:universe, privacy: 'private') } + + context 'when model is private' do + let(:model) do + create( + described_class.model_name.param_key.to_sym, + universe: universe, + privacy: 'private' + ) + end + + describe '#is_public' do + subject { described_class.is_public } + it { is_expected.to_not include(model) } + end + end + + context 'when model is public' do + let(:model) do + create( + described_class.model_name.param_key.to_sym, + universe: universe, + privacy: 'public' + ) + end + + describe '#is_public' do + subject { described_class.is_public } + it { is_expected.to include(model) } + end + end + end +end diff --git a/spec/views/content_question_spec.rb b/spec/views/content_question_spec.rb new file mode 100644 index 00000000..20879cba --- /dev/null +++ b/spec/views/content_question_spec.rb @@ -0,0 +1,34 @@ +describe 'app/views/cards/serendipitous/_content_question.html.erb' do + + let(:question) { 'What is my name?' } + let(:field) { :name } + let(:question_object) { { field: field, question: question } } + let(:content) { create(:character) } + + shared_examples_for 'an empty serendipitous card' do + it 'renders nothing' do + render partial: 'cards/serendipitous/content_question', locals: { question: question_object, content: content } + expect(response).to match(/decided not to render serendipitous card/) + end + end + + context 'when question is an empty string' do + let(:question_object) { '' } + it_behaves_like 'an empty serendipitous card' + end + + context 'when question[:field] is an empty string' do + let(:question_object) { { field: '', question: question } } + it_behaves_like 'an empty serendipitous card' + end + + context 'when question[:question] is an empty string' do + let(:question_object) { { field: field, question: '' } } + it_behaves_like 'an empty serendipitous card' + end + + context 'when content is an empty string' do + let(:content) { '' } + it_behaves_like 'an empty serendipitous card' + end +end diff --git a/test/controllers/.keep b/test/controllers/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/controllers/admin_controller_test.rb b/test/controllers/admin_controller_test.rb deleted file mode 100644 index b8e0acfa..00000000 --- a/test/controllers/admin_controller_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'test_helper' - -class AdminControllerTest < ActionController::TestCase - test "should get dashboard" do - get :dashboard - assert_response :success - end - - test "should get universes" do - get :universes - assert_response :success - end - - test "should get characters" do - get :characters - assert_response :success - end - - test "should get locations" do - get :locations - assert_response :success - end - - test "should get items" do - get :items - assert_response :success - end - -end diff --git a/test/controllers/application_controller_test.rb b/test/controllers/application_controller_test.rb deleted file mode 100644 index 3860e3ad..00000000 --- a/test/controllers/application_controller_test.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'test_helper' - -# Tests for the ApplicationController -class ApplicationControllerTest < ActionController::TestCase -end diff --git a/test/controllers/characters_controller_test.rb b/test/controllers/characters_controller_test.rb deleted file mode 100644 index 56820fc7..00000000 --- a/test/controllers/characters_controller_test.rb +++ /dev/null @@ -1,76 +0,0 @@ -require 'test_helper' - -# Tests for the CharactersController class -class CharactersControllerTest < ActionController::TestCase - include Devise::TestHelpers - - setup do - @request.env['devise.mapping'] = Devise.mappings[:user] - @user = create(:user) - @universe = create(:universe, user: @user) - - sign_in @user - end - - test 'should get index' do - get :index - assert_response :success - assert_not_nil assigns(:content) - end - - test 'should get new' do - get :new - assert_response :success - end - - test 'should create character' do - character = build(:character, universe: @universe, age: 70) - - assert_difference('Character.count') do - post :create, character: { - age: character.age, - name: character.name, - universe: character.universe - } - end - - assert_redirected_to character_path(assigns(:content)) - end - - test 'should show character' do - character = create(:character, user: @user) - - get :show, id: character.id - assert_response :success - end - - test 'should get edit' do - character = create(:character, user: @user) - - get :edit, id: character.id - assert_response :success - end - - test 'should update character' do - character = create(:character, age: 70, universe: @universe, user: @user) - - put :update, id: character.id, character: { - age: character.age, - name: character.name, - universe: character.universe - } - - assert_response 302 - assert_redirected_to character_path(character) - end - - test 'should destroy character' do - character = create(:character, user: @user) - - assert_difference('Character.count', -1) do - delete :destroy, id: character.id - end - - assert_redirected_to characters_url - end -end diff --git a/test/controllers/characters_generator_controller_test.rb b/test/controllers/characters_generator_controller_test.rb deleted file mode 100644 index ba58c60c..00000000 --- a/test/controllers/characters_generator_controller_test.rb +++ /dev/null @@ -1,71 +0,0 @@ -require 'test_helper' - -# Tests for the CharactersGeneratorController -class CharactersGeneratorControllerTest < ActionController::TestCase - test 'age' do - assert_assigns :age, [:upper_limit, :lower_limit] - assert_operator assigns(:lower_limit), :<=, assigns(:upper_limit) - end - - test 'body type' do - assert_assigns :bodytype, [:possible_types] - end - - test 'eye color' do - assert_assigns :eyecolor, [:possible_colors] - end - - test 'facial hair' do - assert_assigns :facialhair, [:possible_styles] - end - - test 'hair color' do - assert_assigns :haircolor, [:possible_colors] - end - - test 'hair style' do - assert_assigns :hairstyle, [:possible_styles] - end - - test 'height' do - assert_assigns :height, [ - :lower_foot_limit, - :upper_foot_limit, - :lower_inch_limit, - :upper_inch_limit - ] - assert_operator assigns(:lower_foot_limit), :<=, assigns(:upper_foot_limit) - assert_operator assigns(:lower_inch_limit), :<=, assigns(:upper_inch_limit) - - assert_operator assigns(:lower_foot_limit), :>=, 0 - assert_operator assigns(:lower_inch_limit), :>=, 0 - end - - test 'identifying mark' do - assert_assigns :identifyingmark, [:possible_marks, :possible_locations] - end - - test 'name' do - assert_assigns :name, [ - :male_first_names, - :female_first_names, - :last_names, - :all_first_names, - :all_last_names - ] - end - - test 'race' do - assert_assigns :race, [:possible_races] - end - - test 'skin tone' do - assert_assigns :skintone, [:possible_tones] - end - - test 'weight' do - assert_assigns :weight, [:upper_limit, :lower_limit] - assert_operator assigns(:lower_limit), :<=, assigns(:upper_limit) - assert_operator assigns(:lower_limit), :>=, 0 - end -end diff --git a/test/controllers/content_controller_test.rb b/test/controllers/content_controller_test.rb deleted file mode 100644 index 953edf87..00000000 --- a/test/controllers/content_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ContentControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/controllers/equipment_generator_controller_test.rb b/test/controllers/equipment_generator_controller_test.rb deleted file mode 100644 index bfb9e546..00000000 --- a/test/controllers/equipment_generator_controller_test.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'test_helper' - -# Tests for the EquipmentGeneratorController -class EquipmentGeneratorControllerTest < ActionController::TestCase - test 'armor shield' do - assert_assigns :armor_shield, [:shield_types] - end - - test 'weapon' do - assert_assigns :weapon, [:weapon_types] - end - - test 'weapon axe' do - assert_assigns :weapon_axe, [:axe_types] - end - - test 'weapon bow' do - assert_assigns :weapon_bow, [:bow_types] - end - - test 'weapon club' do - assert_assigns :weapon_club, [:club_types] - end - - test 'weapon fist' do - assert_assigns :weapon_fist, [:fist_weapon_types] - end - - test 'weapon flexible' do - assert_assigns :weapon_flexible, [:flexible_types] - end - - test 'weapon thrown' do - assert_assigns :weapon_thrown, [:thrown_types] - end - - test 'weapon polearm' do - assert_assigns :weapon_polearm, [:polearm_types] - end - - test 'weapon shortsword' do - assert_assigns :weapon_shortsword, [:shortsword_types] - end - - test 'weapon sword' do - assert_assigns :weapon_sword, [:sword_types] - end -end diff --git a/test/controllers/locations_controller_test.rb b/test/controllers/locations_controller_test.rb deleted file mode 100644 index e024d433..00000000 --- a/test/controllers/locations_controller_test.rb +++ /dev/null @@ -1,91 +0,0 @@ -require 'test_helper' - -# Tests for the LocationsController class -class LocationsControllerTest < ActionController::TestCase - include Devise::TestHelpers - - setup do - @request.env['devise.mapping'] = Devise.mappings[:user] - @user = create(:user) - @universe = create(:universe, user: @user) - - sign_in @user - end - - test 'should get index' do - get :index - assert_response :success - assert_not_nil assigns(:content) - end - - test 'should get new' do - get :new - assert_response :success - end - - test 'should create location' do - location = build(:location, user: @user) - - assert_difference('Location.count') do - post :create, location: { - name: location.name, - universe: @universe, - user: @user - } - end - - assert_redirected_to location_path(assigns(:content)) - end - - test 'should show location' do - location = create(:location, user: @user) - - get :show, id: location - assert_response :success - end - - test 'should get edit' do - location = create(:location, user: @user) - - get :edit, id: location.id - assert_response :success - end - - test 'should update location' do - location = create(:location, user: @user) - - put :update, id: location, location: { - name: location.name + ' Updated', - universe: @universe - } - - assert_response 302 - assert_redirected_to location_path(location) - end - - test 'should destroy location' do - location = create(:location, user: @user) - - assert_difference('Location.count', -1) do - delete :destroy, id: location.id - end - - assert_redirected_to locations_url - end - - test 'should create location with image' do - location = build(:location) - - assert_difference('Location.count') do - map = fixture_file_upload('mordor_map.jpg', 'image/jpeg') - post :create, location: { - name: location.name, - map: map, - universe: @universe, - user: @user - } - end - - assert_redirected_to location_path(assigns(:content)) - end -end diff --git a/test/controllers/locations_generator_controller_test.rb b/test/controllers/locations_generator_controller_test.rb deleted file mode 100644 index ef563cdf..00000000 --- a/test/controllers/locations_generator_controller_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'test_helper' - -# Tests for the LocationsGeneratorController -class LocationsGeneratorControllerTest < ActionController::TestCase - test 'name' do - assert_assigns :name, [ - :root_name, - :prefix_occurrence, - :postfix_occurrence, - :syllables_upper_limit, - :syllables_lower_limit, - :prefixes, - :postfixes, - :syllables - ] - assert_operator assigns(:prefix_occurrence), :<=, 1 - assert_operator assigns(:prefix_occurrence), :>=, 0 - - assert_operator assigns(:postfix_occurrence), :<=, 1 - assert_operator assigns(:postfix_occurrence), :>=, 0 - - assert_operator( - assigns(:syllables_lower_limit), - :<=, - assigns(:syllables_upper_limit)) - - assert_operator assigns(:syllables_lower_limit), :>=, 0 - end -end diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb deleted file mode 100644 index 54e2f12f..00000000 --- a/test/controllers/main_controller_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'test_helper' - -# Tests for the MainController class, which serves the model-non-specific -# pages of the site, like the front page. -class MainControllerTest < ActionController::TestCase - test 'should get index' do - get :index - assert_response :success - end -end diff --git a/test/controllers/siblingship_controller_test.rb b/test/controllers/siblingship_controller_test.rb deleted file mode 100644 index 877113bb..00000000 --- a/test/controllers/siblingship_controller_test.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'test_helper' - -class SiblingshipControllerTest < ActionController::TestCase - # Nothing to test in the SiblingshipController yet -end diff --git a/test/controllers/universes_controller_test.rb b/test/controllers/universes_controller_test.rb deleted file mode 100644 index e65d709d..00000000 --- a/test/controllers/universes_controller_test.rb +++ /dev/null @@ -1,67 +0,0 @@ -require 'test_helper' - -# Tests for the UniversesController -class UniversesControllerTest < ActionController::TestCase - include Devise::TestHelpers - - setup do - @request.env['devise.mapping'] = Devise.mappings[:user] - - @user = create(:user) - sign_in @user - end - - test 'should get index' do - get :index - assert_response :success - assert_not_nil assigns(:content) - end - - test 'should get new' do - get :new - assert_response :success - end - - test 'should create universe' do - universe = build(:universe, user: @user) - - assert_difference('Universe.count') do - post :create, universe: { name: universe.name } - end - - assert_redirected_to universe_path(assigns(:content)) - end - - test 'should show universe' do - universe = create(:universe, user: @user) - - get :show, id: universe.id - assert_response :success - end - - test 'should get edit' do - universe = create(:universe, user: @user) - - get :edit, id: universe.id - assert_response :success - end - - test 'should update universe' do - universe = create(:universe, user: @user) - - put :update, id: universe.id, universe: { name: universe.name + ' Updated' } - - assert_response 302 - assert_redirected_to universe_path(universe) - end - - test 'should destroy universe' do # MWAHAHAHAHAHA!!!!!!! - universe = create(:universe, user: @user) - - assert_difference('Universe.count', -1) do - delete :destroy, id: universe.id - end - - assert_redirected_to universes_url - end -end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb deleted file mode 100644 index 14f15aa1..00000000 --- a/test/controllers/users_controller_test.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'test_helper' - -class UsersControllerTest < ActionController::TestCase - test "should get user profile without error" do - test_user = User.create(email: 'test+test@test.test', password: 'testtesttest') - - get :show, id: test_user.id - assert_response :success - end - -end diff --git a/test/controllers/write_controller_test.rb b/test/controllers/write_controller_test.rb deleted file mode 100644 index e2cb4166..00000000 --- a/test/controllers/write_controller_test.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'test_helper' - -class WriteControllerTest < ActionController::TestCase - include Devise::TestHelpers - setup do - @request.env['devise.mapping'] = Devise.mappings[:user] - @user = create(:user) - - sign_in @user - end - - test 'should get editor' do - get :editor, scene_id: 1 - assert_response :success - end -end diff --git a/test/fixtures/birthings.yml b/test/fixtures/birthings.yml deleted file mode 100644 index 4df45733..00000000 --- a/test/fixtures/birthings.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -one: - character_id: 1 - location_id: 1 - user_id: 1 - -two: - character_id: 1 - location_id: 1 - user_id: 1 diff --git a/test/fixtures/mordor_map.jpg b/test/fixtures/mordor_map.jpg deleted file mode 100644 index 33cd05d4..00000000 Binary files a/test/fixtures/mordor_map.jpg and /dev/null differ diff --git a/test/fixtures/ownerships.yml b/test/fixtures/ownerships.yml deleted file mode 100644 index c1db8f71..00000000 --- a/test/fixtures/ownerships.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -one: - character_id: 1 - item_id: 1 - user_id: 1 - favorite: false - -two: - character_id: 1 - item_id: 1 - user_id: 1 - favorite: false diff --git a/test/fixtures/shire_map.jpg b/test/fixtures/shire_map.jpg deleted file mode 100644 index 525749cd..00000000 Binary files a/test/fixtures/shire_map.jpg and /dev/null differ diff --git a/test/has_privacy_test.rb b/test/has_privacy_test.rb deleted file mode 100644 index ca95a0e2..00000000 --- a/test/has_privacy_test.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'active_support/concern' - -module HasPrivacyTest - extend ActiveSupport::Concern - - included do - test 'responds to public_content' do - assert_respond_to(@object, :public_content?) - end - - test 'responds to private_content' do - assert_respond_to(@object, :private_content?) - end - - test 'object is public when privacy field contains "public"' do - @object.universe.privacy = 'private' - @object.privacy = 'public' - - assert @object.public_content? - refute @object.private_content? - end - - test 'object is private when privacy field contains "private"' do - @object.universe.privacy = 'private' - @object.privacy = 'private' - - assert @object.private_content? - refute @object.public_content? - end - - test 'object is private when privacy field is empty' do - @object.universe.privacy = 'private' - @object.privacy = '' - - assert @object.private_content? - refute @object.public_content? - end - - test 'object is public when universe is public' do - @object.universe.privacy = 'public' - @object.privacy = 'private' - - assert @object.public_content? - refute @object.private_content? - end - end -end diff --git a/test/helpers/.keep b/test/helpers/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/helpers/application_helper_test.rb b/test/helpers/application_helper_test.rb deleted file mode 100644 index fddbfc1a..00000000 --- a/test/helpers/application_helper_test.rb +++ /dev/null @@ -1,6 +0,0 @@ -require 'test_helper' - -# Tests for the ApplicationHelper class -class ApplicationHelperTest < ActionView::TestCase - # Empty, for now -end diff --git a/test/integration/.keep b/test/integration/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/integration/character_stories_test.rb b/test/integration/character_stories_test.rb deleted file mode 100644 index e4c55c21..00000000 --- a/test/integration/character_stories_test.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'test_helper' - -# Tests scenarios related to interacting with Characters -class CharacterStoriesTest < ActionDispatch::IntegrationTest - setup do - @user = log_in_as_user - end - - test 'a user can create a new character' do - character = build(:character) - visit new_character_path - fill_in 'character_name', with: character.name - click_on 'Create Character' - - assert_equal character_path(Character.where(name: character.name).first), current_path - end -end diff --git a/test/integration/location_stories_test.rb b/test/integration/location_stories_test.rb deleted file mode 100644 index 2dcd8ee0..00000000 --- a/test/integration/location_stories_test.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'test_helper' - -# Tests scenarios related to interacting with Locations -class LocationStoriesTest < ActionDispatch::IntegrationTest - setup do - @user = log_in_as_user - @location = create(:location, user: @user) - end - - test 'location is displayed on locations list' do - visit locations_path - assert page.has_content?(@location.name), - "Page body didn't contain location name: "\ - "#{@location.name} not found in \n#{page.body}" - end - - test 'location list edit button edits location' do - visit location_path(@location) - click_on 'Edit this location' - assert_equal edit_location_path(@location), current_path - end - - test 'location list view button shows location' do - visit locations_path - within(:css, '.collection-item:first') do - click_on @location.name - end - assert_equal location_path(@location), current_path, - "Not on location path for location #{@location.name}: "\ - "#{@location.name} not found in \n#{page.body}" - end - - test 'a user can create a new location' do - new_location = build(:location) - visit locations_path - click_on 'Create another location' - fill_in 'location_name', with: new_location.name - click_on 'Create Location' - - assert_equal location_path(Location.where(name: new_location.name).first), - current_path - end -end diff --git a/test/integration/serendipitous_card_test.rb b/test/integration/serendipitous_card_test.rb deleted file mode 100644 index 2ebe276b..00000000 --- a/test/integration/serendipitous_card_test.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'test_helper' - -# Tests for the Serendipitous cards on content pages -class SerendipitousCardTest < ActionDispatch::IntegrationTest - test 'changing character info' do - @user = log_in_as_user - @character = create(:character, user: @user) - @character.save - - visit character_path(@character) - - modified_field_name = find(:css, '.content-question-input')[:id].split('_', 2)[1] - @character[modified_field_name] = 'Previous Value' - @character.save - previous_field_value = @character[modified_field_name] - - find(:css, '.content-question-input').set('Content Question Answer') - find('.content-question-submit').click - - # We can't use @character.changed? because after the form is submitted, - # the changes were saved. - - @character.reload - assert_equal 'Content Question Answer', @character[modified_field_name], - "expected field #{modified_field_name} to change from '#{previous_field_value}' to 'Content Question Answer', but it was '#{@character[modified_field_name]}'" - end -end diff --git a/test/integration/universe_stories_test.rb b/test/integration/universe_stories_test.rb deleted file mode 100644 index ab3704e6..00000000 --- a/test/integration/universe_stories_test.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'test_helper' - -# Tests scenarios related to interacting with Universes -class UniverseStoriesTest < ActionDispatch::IntegrationTest - setup do - @user = log_in_as_user - @universe = create(:universe, user: @user) - end - - test 'universe is displayed on universes list' do - visit universes_path - assert page.has_content?(@universe.name), - "Page body didn't contain universe name: "\ - "#{@universe.name} not found in \n#{page.body}" - end - - test 'universe list edit button edits universe' do - visit universe_path(@universe) - click_on 'Edit this universe' - assert_equal edit_universe_path(@universe), current_path - end - - test 'universe list view button shows universe' do - visit universes_path - within(:css, '.collection-item:first') do - click_on @universe.name - end - assert_equal universe_path(@universe), current_path, - "Not on universe path for universe #{@universe.name}: "\ - "#{@universe.name} not found in \n#{page.body}" - end - - test 'a user can create a new universe' do - new_universe = build(:universe) - visit universes_path - click_on 'Create another universe' - fill_in 'universe_name', with: new_universe.name - click_on 'Create Universe' - - assert_equal universe_path(Universe.where(name: new_universe.name).first), - current_path - end -end diff --git a/test/integration/user_stories_test.rb b/test/integration/user_stories_test.rb deleted file mode 100644 index aed49003..00000000 --- a/test/integration/user_stories_test.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'test_helper' - -# Tests scenarios related to users and their accounts -class UserStoriesTest < ActionDispatch::IntegrationTest - test 'clicking sign up goes to the sign up page' do - visit root_url - click_on 'Sign up' - - assert_equal new_user_registration_path, current_path - end - - test 'submitting the user registration form dumps the user on their dashboard' do - user = build(:user) - register_as user.email, user.password - - assert_equal dashboard_path, current_path - end - - test 'logging in as an existing user goes to the users dashboard' do - user = create(:user) - log_in_as user.email, user.password - - assert_equal dashboard_path, current_path, - 'Existing user was not directed to their dashboard \ - after logging in' - end - - test 'user can register, log out, and log back in' do - user = build(:user) - register_as user.email, user.password - log_out - log_in_as user.email, user.password - assert_equal dashboard_path, current_path - end -end diff --git a/test/mailers/.keep b/test/mailers/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/models/.keep b/test/models/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/models/archenemyship_test.rb b/test/models/archenemyship_test.rb deleted file mode 100644 index 49527ead..00000000 --- a/test/models/archenemyship_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ArchenemyshipTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/best_friendship_test.rb b/test/models/best_friendship_test.rb deleted file mode 100644 index 878b4cb8..00000000 --- a/test/models/best_friendship_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class BestFriendshipTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/birthing_test.rb b/test/models/birthing_test.rb deleted file mode 100644 index 0d893870..00000000 --- a/test/models/birthing_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class BirthingTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/character_test.rb b/test/models/character_test.rb deleted file mode 100644 index 8113b839..00000000 --- a/test/models/character_test.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'test_helper' -require 'has_privacy_test' - -# Tests for the model class Character -class CharacterTest < ActiveSupport::TestCase - include HasPrivacyTest - - setup do - @character = build(:character) - - # for HasPrivacyTest - @object = @character - end - - test 'character not valid without a name' do - @character.name = nil - - refute @character.valid?, 'Character name not being validated for presence' - end - - test 'character is_public scope' do - public_universe = create(:universe, privacy: 'public') - private_universe = create(:universe, privacy: 'private') - - pub_character_pub_universe = create(:character, privacy: 'public', universe: public_universe) - pub_character_priv_universe = create(:character, privacy: 'public', universe: private_universe) - priv_character_pub_universe = create(:character, privacy: 'private', universe: public_universe) - priv_character_priv_universe = create(:character, privacy: 'private', universe: private_universe) - - public_scope = Character.is_public - - assert_includes public_scope, pub_character_pub_universe, "didn't contain a public character in a public universe" - assert_includes public_scope, pub_character_priv_universe, "didn't contain a public character in a private universe" - assert_includes public_scope, priv_character_pub_universe, "didn't contain a private character in a public universe" - - refute_includes public_scope, priv_character_priv_universe, "contained a private character in a private universe" - end -end diff --git a/test/models/fathership_test.rb b/test/models/fathership_test.rb deleted file mode 100644 index 72f1dcf0..00000000 --- a/test/models/fathership_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class FathershipTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/item_test.rb b/test/models/item_test.rb deleted file mode 100644 index 89225bb8..00000000 --- a/test/models/item_test.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'test_helper' -require 'has_privacy_test' - -# Tests for the Location model class -class ItemTest < ActiveSupport::TestCase - include HasPrivacyTest - - setup do - @item = create(:item) - @object = @item - end - - test 'item not valid without a name' do - @item.name = nil - - refute @item.valid?, 'Item name is not being validated for presence' - end - - test 'item is_public scope' do - public_universe = create(:universe, privacy: 'public') - private_universe = create(:universe, privacy: 'private') - - pub_item_pub_universe = create(:item, privacy: 'public', universe: public_universe) - pub_item_priv_universe = create(:item, privacy: 'public', universe: private_universe) - priv_item_pub_universe = create(:item, privacy: 'private', universe: public_universe) - priv_item_priv_universe = create(:item, privacy: 'private', universe: private_universe) - - public_scope = Item.is_public - - assert_includes public_scope, pub_item_pub_universe, "didn't contain a public item in a public universe" - assert_includes public_scope, pub_item_priv_universe, "didn't contain a public item in a private universe" - assert_includes public_scope, priv_item_pub_universe, "didn't contain a private item in a public universe" - - refute_includes public_scope, priv_item_priv_universe, "contained a private item in a private universe" - end -end diff --git a/test/models/location_test.rb b/test/models/location_test.rb deleted file mode 100644 index 3fbbd734..00000000 --- a/test/models/location_test.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'test_helper' -require 'has_privacy_test' - -# Tests for the Location model class -class LocationTest < ActiveSupport::TestCase - include HasPrivacyTest - - setup do - @location = create(:location) - @object = @location - end - - test 'location not valid without a name' do - @location.name = nil - - refute @location.valid?, 'Location name is not being validated for presence' - end - - test 'location is_public scope' do - public_universe = create(:universe, privacy: 'public') - private_universe = create(:universe, privacy: 'private') - - pub_location_pub_universe = create(:location, privacy: 'public', universe: public_universe) - pub_location_priv_universe = create(:location, privacy: 'public', universe: private_universe) - priv_location_pub_universe = create(:location, privacy: 'private', universe: public_universe) - priv_location_priv_universe = create(:location, privacy: 'private', universe: private_universe) - - public_scope = Location.is_public - - assert_includes public_scope, pub_location_pub_universe, "didn't contain a public location in a public universe" - assert_includes public_scope, pub_location_priv_universe, "didn't contain a public location in a private universe" - assert_includes public_scope, priv_location_pub_universe, "didn't contain a private location in a public universe" - - refute_includes public_scope, priv_location_priv_universe, "contained a private location in a private universe" - end -end diff --git a/test/models/marriage_test.rb b/test/models/marriage_test.rb deleted file mode 100644 index 21ebf68b..00000000 --- a/test/models/marriage_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class MarriageTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/mothership_test.rb b/test/models/mothership_test.rb deleted file mode 100644 index e4a8616e..00000000 --- a/test/models/mothership_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class MothershipTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/ownership_test.rb b/test/models/ownership_test.rb deleted file mode 100644 index 4ac93e14..00000000 --- a/test/models/ownership_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class OwnershipTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/siblingship_test.rb b/test/models/siblingship_test.rb deleted file mode 100644 index 46abe74f..00000000 --- a/test/models/siblingship_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class SiblingshipTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/universe_test.rb b/test/models/universe_test.rb deleted file mode 100644 index 6da6a731..00000000 --- a/test/models/universe_test.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'test_helper' - -# Tests for the Universe model class -class UniverseTest < ActiveSupport::TestCase - test 'universe not valid without a name' do - universe = build(:universe, name: nil) - - refute universe.valid?, 'Universe name is not being validated for presence' - end - - test 'universe is private when privacy field contains "private"' do - universe = build(:universe, privacy: 'private') - - assert universe.private_content? - refute universe.public_content? - end - - test 'universe is private when privacy field is empty' do - universe = build(:universe, privacy: '') - - assert universe.private_content? - refute universe.public_content? - end -end diff --git a/test/models/user_test.rb b/test/models/user_test.rb deleted file mode 100644 index 55d42fed..00000000 --- a/test/models/user_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'test_helper' - -# Tests for the User model class -class UserTest < ActiveSupport::TestCase - test 'user has a Gravatar profile image' do - user = build(:user, email: 'profile.image.test@example.com') - - assert_match 'https://www.gravatar.com/avatar/d2fd00e79c471f49c33b6bcb6b08d08d', user.image_url - end -end diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rb deleted file mode 100644 index bf4e6d19..00000000 --- a/test/performance/browsing_test.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'test_helper' -require 'rails/performance_test_help' - -# Tests performance by browsing the site -# Refer to the documentation for all available options -# self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory] -# :output => 'tmp/performance', :formats => [:flat] } -class BrowsingTest < ActionDispatch::PerformanceTest -end diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index 57bdc98e..00000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,79 +0,0 @@ -require 'simplecov' -require 'coveralls' -SimpleCov.formatter = Coveralls::SimpleCov::Formatter -SimpleCov.start 'rails' - -ENV['RAILS_ENV'] ||= 'test' -require File.expand_path('../../config/environment', __FILE__) -require 'rails/test_help' -require 'capybara/rails' - -module ActiveSupport - # Helper methods for unit tests - class TestCase - include FactoryGirl::Syntax::Methods - - def log_in_user(user_fixture) - session[:user] = users(user_fixture).id - end - end -end - -module ActionController - # Helper methods for controller tests - class TestCase - include Devise::TestHelpers - - def assert_assigns(method, assigned = {}) - get method - assert_response :success - assigned.each do |val| - assert_not assigns(val).blank?, "#{method} did not assign #{val}" - end - end - end -end - -module ActionDispatch - # Helper methods for integration tests - class IntegrationTest - # Make the Capybara DSL available in all integration tests - include Capybara::DSL - include FactoryGirl::Syntax::Methods - - def register_as(email, password) - visit new_user_registration_path - fill_in 'Email', with: email - fill_in 'Password', with: password - fill_in 'Password confirmation', with: password - within '#new_user' do - click_on 'Sign up' - end - end - - def log_in_as(email, password) - visit new_user_session_path - fill_in 'Email', with: email - fill_in 'Password', with: password - - within '#new_user' do - click_on 'Log in' - end - end - - def log_in_as_user - user = create(:user) - log_in_as user.email, user.password - user - end - - def log_out - visit destroy_user_session_path - end - - def teardown - Capybara.reset_sessions! - Capybara.use_default_driver - end - end -end