answers-core 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +6 -0
- data/answers-core.gemspec +30 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.eot +0 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.svg +230 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.ttf +0 -0
- data/app/assets/fonts/answers/League_Gothic-webfont.woff +0 -0
- data/app/assets/images/OaklandCityTree.png +0 -0
- data/app/assets/images/background_image.jpg +0 -0
- data/app/assets/images/background_pattern.png +0 -0
- data/app/assets/images/beta.png +0 -0
- data/app/assets/images/bg_transparent.png +0 -0
- data/app/assets/images/border.png +0 -0
- data/app/assets/images/brigade.png +0 -0
- data/app/assets/images/cfa.png +0 -0
- data/app/assets/images/cfa_logo.png +0 -0
- data/app/assets/images/cfa_logo_footer.png +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/forest.jpeg +0 -0
- data/app/assets/images/getting_started_btn.png +0 -0
- data/app/assets/images/govuk.png +0 -0
- data/app/assets/images/openoaklandlogo.png +0 -0
- data/app/assets/images/quick_answers_icon.png +0 -0
- data/app/assets/images/quick_answers_icon_small.png +0 -0
- data/app/assets/images/searchIcon.png +0 -0
- data/app/assets/images/wmd-buttons.png +0 -0
- data/app/assets/images/yellow_bg.png +0 -0
- data/app/assets/javascripts/answers.js +19 -0
- data/app/assets/javascripts/answers/Markdown.Extra.js +304 -0
- data/app/assets/javascripts/answers/active_admin.js +62 -0
- data/app/assets/javascripts/answers/pagedown/LICENSE.txt +32 -0
- data/app/assets/javascripts/answers/pagedown/Markdown.Converter.js +1332 -0
- data/app/assets/javascripts/answers/pagedown/Markdown.Editor.js +2212 -0
- data/app/assets/javascripts/answers/pagedown/Markdown.Sanitizer.js +108 -0
- data/app/assets/javascripts/answers/pagedown/README.txt +0 -0
- data/app/assets/javascripts/answers/pagedown/demo/browser/demo.css +120 -0
- data/app/assets/javascripts/answers/pagedown/demo/browser/demo.html +83 -0
- data/app/assets/javascripts/answers/pagedown/demo/node/demo.js +44 -0
- data/app/assets/javascripts/answers/pagedown/local/Markdown.local.fr.js +43 -0
- data/app/assets/javascripts/answers/pagedown/node-pagedown.js +2 -0
- data/app/assets/javascripts/answers/pagedown/package.json +12 -0
- data/app/assets/javascripts/answers/pagedown/resources/wmd-buttons.psd +0 -0
- data/app/assets/javascripts/answers/pagedown/wmd-buttons.png +0 -0
- data/app/assets/javascripts/answers/skip_nav.js +8 -0
- data/app/assets/stylesheets/answers/active_admin.css.scss +17 -0
- data/app/assets/stylesheets/answers/active_admin_custom.css.scss +35 -0
- data/app/assets/stylesheets/answers/formatting.css +82 -0
- data/app/assets/stylesheets/answers/mobile.css +149 -0
- data/app/assets/stylesheets/answers/tags.css.scss +3 -0
- data/app/assets/stylesheets/answers/theme.css +916 -0
- data/app/controllers/answers/answers_controller.rb +26 -0
- data/app/controllers/answers/api/v1/answers_controller.rb +38 -0
- data/app/controllers/answers/api/v1/api_controller.rb +13 -0
- data/app/controllers/answers/api/v1/questions_controller.rb +39 -0
- data/app/controllers/answers/api/v1/taggings_controller.rb +46 -0
- data/app/controllers/answers/api/v1/tags_controller.rb +38 -0
- data/app/controllers/answers/application_controller.rb +27 -0
- data/app/controllers/answers/home_controller.rb +17 -0
- data/app/controllers/answers/questions_controller.rb +33 -0
- data/app/controllers/answers/search_controller.rb +22 -0
- data/app/controllers/answers/tags_controller.rb +36 -0
- data/app/helpers/answers/tags_helper.rb +7 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/answers/ability.rb +28 -0
- data/app/models/answers/administrator.rb +5 -0
- data/app/models/answers/answer.rb +6 -0
- data/app/models/answers/api/v1/api_user.rb +5 -0
- data/app/models/answers/question.rb +31 -0
- data/app/models/answers/user.rb +30 -0
- data/app/views/answers/admin/contacts/_article.html.erb +0 -0
- data/app/views/answers/admin/dashboard/_dashboard.html.erb +5 -0
- data/app/views/answers/admin/guide_steps/_form.html.erb +17 -0
- data/app/views/answers/api/v1/answers/_answer.json.jbuilder +2 -0
- data/app/views/answers/api/v1/answers/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/answers/show.json.jbuilder +1 -0
- data/app/views/answers/api/v1/questions/_question.json.jbuilder +2 -0
- data/app/views/answers/api/v1/questions/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/questions/show.json.jbuilder +1 -0
- data/app/views/answers/api/v1/taggings/_tagging.json.jbuilder +3 -0
- data/app/views/answers/api/v1/taggings/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/taggings/show.json.jbuilder +1 -0
- data/app/views/answers/api/v1/tags/_tag.json.jbuilder +2 -0
- data/app/views/answers/api/v1/tags/index.json.jbuilder +1 -0
- data/app/views/answers/api/v1/tags/show.json.jbuilder +1 -0
- data/app/views/answers/devise/confirmations/new.html.erb +12 -0
- data/app/views/answers/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/answers/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/answers/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/answers/devise/passwords/edit.html.erb +24 -0
- data/app/views/answers/devise/passwords/new.html.erb +20 -0
- data/app/views/answers/devise/registrations/edit.html.erb +25 -0
- data/app/views/answers/devise/registrations/new.html.erb +18 -0
- data/app/views/answers/devise/sessions/new.html.erb +25 -0
- data/app/views/answers/devise/shared/_links.erb +25 -0
- data/app/views/answers/devise/unlocks/new.html.erb +12 -0
- data/app/views/answers/home/_article.html.erb +3 -0
- data/app/views/answers/home/_category.html.erb +8 -0
- data/app/views/answers/home/about.html.erb +72 -0
- data/app/views/answers/home/index.html.erb +44 -0
- data/app/views/answers/questions/index.html.erb +21 -0
- data/app/views/answers/questions/show.html.erb +31 -0
- data/app/views/answers/search/index.html.erb +32 -0
- data/app/views/answers/shared/_articles_sidebar.html.erb +22 -0
- data/app/views/answers/shared/_autocomplete.html.erb +8 -0
- data/app/views/answers/shared/_categories_sidebar.html.erb +12 -0
- data/app/views/answers/shared/_search_form.html.erb +4 -0
- data/app/views/answers/shared/admin/_administration.html.erb +38 -0
- data/app/views/answers/shared/admin/_article_actions.html.erb +86 -0
- data/app/views/answers/shared/admin/_article_content.html.erb +27 -0
- data/app/views/answers/shared/admin/_article_details.html.erb +11 -0
- data/app/views/answers/shared/admin/_article_form.html.erb +20 -0
- data/app/views/answers/shared/admin/_author_pic.html.erb +0 -0
- data/app/views/answers/tags/index.html.erb +34 -0
- data/app/views/answers/tags/show.html.erb +31 -0
- data/app/views/layouts/answers/application.html.erb +97 -0
- data/config.ru +5 -0
- data/config/initializers/active_admin.rb +245 -0
- data/config/initializers/devise.rb +228 -0
- data/config/locales/devise.en.yml +57 -0
- data/config/locales/en.yml +129 -0
- data/config/routes.rb +22 -0
- data/config/secrets.yml +68 -0
- data/db/migrate/20140911060606_answers_up.rb +79 -0
- data/lib/answers-core.rb +1 -0
- data/lib/answers.rb +175 -0
- data/lib/answers/admin/answer.rb +29 -0
- data/lib/answers/admin/dashboard.rb +75 -0
- data/lib/answers/admin/question.rb +57 -0
- data/lib/answers/admin/tag.rb +12 -0
- data/lib/answers/admin/users.rb +65 -0
- data/lib/answers/core.rb +25 -0
- data/lib/answers/core/configuration.rb +90 -0
- data/lib/answers/core/engine.rb +116 -0
- data/lib/answers/engine.rb +62 -0
- data/lib/answers/errors.rb +13 -0
- data/lib/answers/plugin.rb +75 -0
- data/lib/answers/plugins.rb +73 -0
- data/lib/answers/version.rb +16 -0
- data/lib/api_client.rb +20 -0
- data/lib/assets/.gitkeep +0 -0
- data/lib/assets/eng_stop.csv +1 -0
- data/lib/generators/answers/clash_keywords.yml +3 -0
- data/lib/generators/answers/cms/cms_generator.rb +314 -0
- data/lib/generators/answers/cms/templates/.gitignore +91 -0
- data/lib/generators/answers/cms/templates/app/decorators/controllers/answers/.keep +0 -0
- data/lib/generators/answers/cms/templates/app/decorators/models/answers/.keep +0 -0
- data/lib/generators/answers/cms/templates/app/views/sitemap/index.xml.builder +15 -0
- data/lib/generators/answers/cms/templates/config/database.yml.mysql +20 -0
- data/lib/generators/answers/cms/templates/config/database.yml.postgresql +58 -0
- data/lib/generators/answers/cms/templates/config/database.yml.sqlite3 +18 -0
- data/lib/generators/answers/core/core_generator.rb +10 -0
- data/lib/generators/answers/core/templates/config/initializers/answers/core.rb.erb +35 -0
- data/lib/generators/answers/dummy/dummy_generator.rb +86 -0
- data/lib/generators/answers/dummy/templates/rails/Rakefile +7 -0
- data/lib/generators/answers/dummy/templates/rails/application.js +3 -0
- data/lib/generators/answers/dummy/templates/rails/application.rb.erb +12 -0
- data/lib/generators/answers/dummy/templates/rails/boot.rb.erb +6 -0
- data/lib/generators/answers/dummy/templates/rails/database.yml +34 -0
- data/lib/generators/answers/dummy/templates/rails/routes.rb +3 -0
- data/lib/generators/answers/engine/USAGE +24 -0
- data/lib/generators/answers/engine/engine_generator.rb +44 -0
- data/lib/generators/answers/engine/templates/.gitignore +2 -0
- data/lib/generators/answers/engine/templates/Gemfile +42 -0
- data/lib/generators/answers/engine/templates/Rakefile +19 -0
- data/lib/generators/answers/engine/templates/answers-extension_plural_name.gemspec +19 -0
- data/lib/generators/answers/engine/templates/app/controllers/answers/namespace/admin/plural_name_controller.rb.erb +14 -0
- data/lib/generators/answers/engine/templates/app/controllers/answers/namespace/plural_name_controller.rb.erb +34 -0
- data/lib/generators/answers/engine/templates/app/models/answers/namespace/singular_name.rb.erb +37 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_actions.html.erb +25 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_form.html.erb +65 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_plural_name.html.erb +2 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_records.html.erb +16 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_singular_name.html.erb +33 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/_sortable_list.html.erb +5 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/edit.html.erb +1 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/index.html.erb +7 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/admin/plural_name/new.html.erb +1 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/plural_name/index.html.erb +11 -0
- data/lib/generators/answers/engine/templates/app/views/answers/namespace/plural_name/show.html.erb +39 -0
- data/lib/generators/answers/engine/templates/config/locales/cs.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/en.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/es.yml +29 -0
- data/lib/generators/answers/engine/templates/config/locales/fr.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/it.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/nb.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/nl.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/sk.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/tr.yml +28 -0
- data/lib/generators/answers/engine/templates/config/locales/zh-CN.yml +30 -0
- data/lib/generators/answers/engine/templates/config/routes.rb.erb +19 -0
- data/lib/generators/answers/engine/templates/db/migrate/1_create_namespace_plural_name.rb.erb +39 -0
- data/lib/generators/answers/engine/templates/db/seeds.rb.erb +21 -0
- data/lib/generators/answers/engine/templates/lib/answers-extension_plural_name.rb.erb +1 -0
- data/lib/generators/answers/engine/templates/lib/answers/plural_name.rb.erb +21 -0
- data/lib/generators/answers/engine/templates/lib/answers/plural_name/engine.rb.erb +23 -0
- data/lib/generators/answers/engine/templates/lib/generators/answers/extension_plural_name_generator.rb.erb +19 -0
- data/lib/generators/answers/engine/templates/lib/tasks/answers/extension_plural_name.rake +13 -0
- data/lib/generators/answers/engine/templates/readme.md +10 -0
- data/lib/generators/answers/engine/templates/script/rails +10 -0
- data/lib/generators/answers/engine/templates/spec/features/answers/namespace/admin/plural_name_spec.rb.erb +200 -0
- data/lib/generators/answers/engine/templates/spec/models/answers/namespace/singular_name_spec.rb.erb +20 -0
- data/lib/generators/answers/engine/templates/spec/spec_helper.rb +31 -0
- data/lib/generators/answers/engine/templates/spec/support/factories/answers/plural_name.rb.erb +7 -0
- data/lib/generators/answers/engine/templates/tasks/rspec.rake +6 -0
- data/lib/generators/answers/engine/templates/tasks/testing.rake +8 -0
- data/lib/generators/answers/generator.rb +292 -0
- data/lib/markdownifier.rb +11 -0
- data/log/.gitkeep +0 -0
- data/log/development.log +12870 -0
- data/log/newrelic_agent.log +1339 -0
- data/log/test.log +233181 -0
- data/public/404.html +25 -0
- data/public/422.html +25 -0
- data/public/500.html +24 -0
- data/public/favicon.ico +0 -0
- data/public/robots.txt +5 -0
- data/script/delayed_job +5 -0
- data/spec/controllers/answers_controller_spec.rb +55 -0
- data/spec/controllers/api/v1/answers_controller_spec.rb +144 -0
- data/spec/controllers/api/v1/questions_controller_spec.rb +144 -0
- data/spec/controllers/api/v1/taggings_controller_spec.rb +126 -0
- data/spec/controllers/api/v1/tags_controller_spec.rb +126 -0
- data/spec/controllers/home_controller_spec.rb +60 -0
- data/spec/controllers/questions_controller_spec.rb +55 -0
- data/spec/controllers/tags_controller_spec.rb +42 -0
- data/spec/factories/answers.rb +10 -0
- data/spec/factories/questions.rb +8 -0
- data/spec/factories/tags.rb +8 -0
- data/spec/factories/user.rb +32 -0
- data/spec/features/admin_dashboard_spec.rb +53 -0
- data/spec/features/admin_user_spec.rb +61 -0
- data/spec/features/searches_spec.rb +101 -0
- data/spec/fixtures/Article/_before_validation/sets_access_count_if_nil.yml +223 -0
- data/spec/fixtures/Article/_delete_orphaned_keywords/updating_an_article/destroys_orphaned_keywords_associated.yml +223 -0
- data/spec/fixtures/Article/_delete_orphaned_keywords/when_deleting_an_article/destroys_all_keywords_associated.yml +223 -0
- data/spec/fixtures/Article/_find_by_friendly_id/when_an_article_does_not_exist/does_not_raise_an_exception.yml +223 -0
- data/spec/fixtures/Article/_find_by_friendly_id/when_an_article_exists/returns_the_corresponding_article.yml +223 -0
- data/spec/fixtures/Article/_find_by_type/excludes_articles_not_matching_specified_type.yml +223 -0
- data/spec/fixtures/Article/_find_by_type/returns_articles_matching_type.yml +223 -0
- data/spec/fixtures/Article/_hits/before_an_article_has_been_viewed/has_zero_hits.yml +223 -0
- data/spec/fixtures/Article/_hits/returns_number_of_views/has_seven_views.yml +223 -0
- data/spec/fixtures/Article/_indexable_/returns_false_if_article_is_not_published.yml +223 -0
- data/spec/fixtures/Article/_indexable_/returns_true_if_article_is_published.yml +223 -0
- data/spec/fixtures/Article/_legacy_/returns_true_if_render_markdown_is_false.yml +223 -0
- data/spec/fixtures/Article/_qm_after_create/creates_wordcounts_for_relevant_keywords.yml +223 -0
- data/spec/fixtures/Article/_record_hit/viewing_an_article/increases_hit_by_one.yml +223 -0
- data/spec/fixtures/Article/_related/has_no_related_articles/.yml +223 -0
- data/spec/fixtures/Article/_related/has_related_articles/.yml +223 -0
- data/spec/fixtures/Article/_remove_stop_words/removes_common_english_words_from_the_string.yml +223 -0
- data/spec/fixtures/Article/_search/_search_titles/query_is_present_in_the_title/.yml +223 -0
- data/spec/fixtures/Article/_search/_search_titles/returns_an_empty_array_when_the_search_term_is_present_in_an_article_but_not_the_title.yml +223 -0
- data/spec/fixtures/Article/_search/matches_articles_in_the_database.yml +223 -0
- data/spec/fixtures/Article/_search/query_does_not_match_anything_in_the_database/returns_an_empty_array.yml +223 -0
- data/spec/fixtures/Article/_search/query_is_a_single_space/.yml +223 -0
- data/spec/fixtures/Article/_search/query_is_an_empty_string/.yml +223 -0
- data/spec/fixtures/Article/_to_s/when_an_article_has_a_category/returns_a_string_containing_title_id_and_category.yml +223 -0
- data/spec/fixtures/Article/can_be_published/an_unpublished_article/is_published.yml +223 -0
- data/spec/fixtures/Article/can_be_published/an_unpublished_article/returns_status_Published.yml +223 -0
- data/spec/fixtures/Article/has_a_friendly_url.yml +223 -0
- data/spec/fixtures/Article/is_valid_with_a_title.yml +223 -0
- data/spec/fixtures/Searches/search_results/1_result_found/.yml +22047 -0
- data/spec/fixtures/Searches/search_results/no_results_found/.yml +393 -0
- data/spec/fixtures/Searches/search_results/several_results_found/should_contain_the_title_and_preview_of_both_articles.yml +223 -0
- data/spec/fixtures/Searches/search_results/several_results_found/show_the_query.yml +277 -0
- data/spec/fixtures/articles.yml +428 -0
- data/spec/fixtures/categories.yml +17 -0
- data/spec/fixtures/contacts.yml +11 -0
- data/spec/fixtures/dragon_keyword_cassette.yml +77 -0
- data/spec/fixtures/oakland_answers.yml +2379 -0
- data/spec/helpers/tags_helper_spec.rb +15 -0
- data/spec/lib/markdownifier_spec.rb +12 -0
- data/spec/models/ability_spec.rb +36 -0
- data/spec/models/answer_spec.rb +5 -0
- data/spec/models/question_spec.rb +70 -0
- data/spec/models/user_spec.rb +55 -0
- data/spec/routing/answers_routing_spec.rb +19 -0
- data/spec/routing/questions_routing_spec.rb +19 -0
- data/spec/routing/routes_spec.rb +13 -0
- data/spec/security/brakeman_spec.rb +37 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/support/login_helpers.rb +10 -0
- data/spec/support/wait_for_ajax_helper.rb +7 -0
- data/spec/support/wait_for_dom_helper.rb +12 -0
- data/spec/views/questions/index.html.erb_spec.rb +16 -0
- data/spec/views/questions/show.html.erb_spec.rb +14 -0
- data/spec/views/tags/index.html.erb_spec.rb +5 -0
- data/spec/views/tags/show.html.erb_spec.rb +5 -0
- data/vendor/assets/javascripts/.gitkeep +0 -0
- data/vendor/assets/stylesheets/.gitkeep +0 -0
- data/vendor/assets/stylesheets/bootstrap.css +3990 -0
- data/vendor/crudgen/lib/generators/crudgen/install_generator.rb +23 -0
- data/vendor/plugins/.gitkeep +0 -0
- metadata +484 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Specs in this file have access to a helper object that includes
|
4
|
+
# the TagsHelper. For example:
|
5
|
+
#
|
6
|
+
# describe TagsHelper do
|
7
|
+
# describe "string concat" do
|
8
|
+
# it "concats two strings with spaces" do
|
9
|
+
# expect(helper.concat_strings("this","that")).to eq("this that")
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
RSpec.describe Answers::TagsHelper, :type => :helper do
|
14
|
+
pending "add some examples to (or delete) #{__FILE__}"
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Markdownifier do
|
4
|
+
it "converts markdown to html" do
|
5
|
+
markdownifier = Markdownifier::Markdownifier.new
|
6
|
+
input = "<h1>hello</h1>"
|
7
|
+
output = markdownifier.html_to_markdown(input)
|
8
|
+
|
9
|
+
expect(output.class).to eq(String)
|
10
|
+
expect(output[0]).to eq('#')
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require "cancan/matchers"
|
3
|
+
|
4
|
+
describe Answers::Ability, :type => :model do
|
5
|
+
subject { Answers::Ability.new(user) }
|
6
|
+
let (:user) { nil }
|
7
|
+
|
8
|
+
context 'when user is just a user' do
|
9
|
+
let (:user) { create(:user_no_abilities) }
|
10
|
+
pending 'why'
|
11
|
+
it { is_expected.to be_able_to(:read, Answers::Question.new) }
|
12
|
+
it { is_expected.to be_able_to(:read, Answers::Answer.new) }
|
13
|
+
|
14
|
+
it { is_expected.not_to be_able_to(:manage, Answers::Question.new) }
|
15
|
+
it { is_expected.not_to be_able_to(:manage, Answers::Answer.new) }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when user is an editor' do
|
19
|
+
let (:user) { create(:editor) }
|
20
|
+
|
21
|
+
it { is_expected.to be_able_to(:manage, Answers::Question.new) }
|
22
|
+
it { is_expected.to be_able_to(:manage, Answers::Answer.new) }
|
23
|
+
|
24
|
+
it { is_expected.not_to be_able_to(:manage, Answers::User.new) }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when user is a writer' do
|
28
|
+
let (:user) { create(:writer) }
|
29
|
+
|
30
|
+
it { is_expected.to be_able_to(:create, Answers::Question.new) }
|
31
|
+
it { is_expected.to be_able_to(:create, Answers::Answer.new) }
|
32
|
+
|
33
|
+
it { is_expected.not_to be_able_to(:manage, Answers::User.new) }
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Answers::Question, :type => :model do
|
4
|
+
let(:question) { create(:question) }
|
5
|
+
let(:answer) { create(:answer) }
|
6
|
+
|
7
|
+
context "when an accepted answer exists" do
|
8
|
+
it "should return the top answer" do
|
9
|
+
question.answers << answer
|
10
|
+
|
11
|
+
question.save
|
12
|
+
expect(question.top_answer).to be_valid
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "top_answer" do
|
17
|
+
let(:question) { create(:question) }
|
18
|
+
|
19
|
+
it "should return nil" do
|
20
|
+
expect(question.top_answer).to be_nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "tagging" do
|
25
|
+
let(:question1) { create(:question) }
|
26
|
+
let(:tags) do
|
27
|
+
5.times.map { |n| create(:tag) }
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
it "should have a tag_list" do
|
32
|
+
expect(question1).to(respond_to(:tag_list))
|
33
|
+
expect(question1.tag_list).to(be_a(Array))
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when tags are loaded" do
|
37
|
+
let(:tags) do
|
38
|
+
5.times.map { |n| create(:tag) }
|
39
|
+
end
|
40
|
+
before(:each) do
|
41
|
+
allow(Answers::Question).to(receive(:tag_counts_on)).with(:tags).and_return(tags)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should return an empty Array" do
|
45
|
+
my_tags = Answers::Question.tags
|
46
|
+
expect(my_tags).to(be_a(Array))
|
47
|
+
expect(my_tags.length).to(eq(tags.length))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "when no tags are loaded" do
|
52
|
+
let(:tags) { [] }
|
53
|
+
before(:each) do
|
54
|
+
allow(Answers::Question).to(receive(:tag_counts_on)).with(:tags).and_return(tags)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should return an empty Array" do
|
58
|
+
my_tags = Answers::Question.tags
|
59
|
+
expect(my_tags).to(be_a(Array))
|
60
|
+
expect(my_tags.length).to(eq(0))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
#context "when some tags are loaded" do
|
65
|
+
# it "should return an Array of tag objects" do
|
66
|
+
#
|
67
|
+
# end
|
68
|
+
#end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Answers::User, :type => :model do
|
4
|
+
it "is valid with an email, password and password confirmation" do
|
5
|
+
user = Answers::User.new(
|
6
|
+
:email => 'user@example.com',
|
7
|
+
:password => 'passwordsrsly',
|
8
|
+
:password_confirmation => 'passwordsrsly'
|
9
|
+
)
|
10
|
+
|
11
|
+
expect(user).to be_valid
|
12
|
+
end
|
13
|
+
|
14
|
+
it "is invalid without an email" do
|
15
|
+
user = Answers::User.new(
|
16
|
+
:password => 'passwordsrsly',
|
17
|
+
:password_confirmation => 'passwordsrsly'
|
18
|
+
)
|
19
|
+
|
20
|
+
expect(user.valid?).to be false
|
21
|
+
expect(user.errors[:email].size).to eq(1)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "is invalid without a valid email" do
|
25
|
+
user = Answers::User.new(
|
26
|
+
:email => '+++ FREE PHARMACY ?ONLINE!! +++',
|
27
|
+
:password => 'passwordsrsly',
|
28
|
+
:password_confirmation => 'passwordsrsly'
|
29
|
+
)
|
30
|
+
|
31
|
+
expect(user.valid?).to be false
|
32
|
+
expect(user.errors[:email].size).to eq(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "is invalid without a password and confirmation" do
|
36
|
+
user = Answers::User.new(
|
37
|
+
:email => 'user@example.com'
|
38
|
+
)
|
39
|
+
expect(user.valid?).to be false
|
40
|
+
expect {user.save!}.to raise_error(ActiveRecord::RecordInvalid, "Validation failed: Password can't be blank")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "has only one role" do
|
44
|
+
user = Answers::User.new(
|
45
|
+
:email => 'user@example.com',
|
46
|
+
:password => 'passwordsrsly',
|
47
|
+
:password_confirmation => 'passwordsrsly',
|
48
|
+
:is_admin => true,
|
49
|
+
:is_editor => true
|
50
|
+
)
|
51
|
+
user.save
|
52
|
+
expect(user.is_admin?).to eq true
|
53
|
+
expect(user.is_writer).to eq false
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Answers::QuestionsController, :type => :routing do
|
4
|
+
describe "routing" do
|
5
|
+
|
6
|
+
it "routes to #index" do
|
7
|
+
pending 'needs to be fixed for new engine layout'
|
8
|
+
|
9
|
+
expect(:get => "/answers").to route_to("questions#index")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "routes to #show" do
|
13
|
+
pending 'needs to be fixed for new engine layout'
|
14
|
+
|
15
|
+
expect(:get => "/answers/1").to route_to("questions#show", :id => "1")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Answers::QuestionsController, :type => :routing do
|
4
|
+
describe "routing" do
|
5
|
+
|
6
|
+
it "routes to #index" do
|
7
|
+
pending 'needs to be fixed for new engine layout'
|
8
|
+
|
9
|
+
expect(:get => "/answers").to route_to("questions#index")
|
10
|
+
end
|
11
|
+
|
12
|
+
it "routes to #show" do
|
13
|
+
pending 'needs to be fixed for new engine layout'
|
14
|
+
|
15
|
+
expect(:get => "/answers/1").to route_to("questions#show", :id => "1")
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "routing to search results", :type => :routing do
|
4
|
+
it "routes /search/ to search#index for a given query" do
|
5
|
+
pending 'needs to be fixed for new engine layout'
|
6
|
+
|
7
|
+
expect({ :get => "/search/" }).to route_to(
|
8
|
+
:controller => 'search',
|
9
|
+
:action => 'index'
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'brakeman'
|
3
|
+
|
4
|
+
def format_warnings(warnings, type)
|
5
|
+
warnings.join("\n") << "\n Run `rake 'security:#{type}[0]'` to debug."
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "Answers" do
|
9
|
+
let(:checks) do
|
10
|
+
tracker = Brakeman.run({
|
11
|
+
app_path: '.',
|
12
|
+
min_confidence: 0
|
13
|
+
})
|
14
|
+
checks = tracker.checks
|
15
|
+
checks
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns zero high confidence controller warnings", :security do
|
19
|
+
brakeman_warnings = checks.controller_warnings
|
20
|
+
expect(brakeman_warnings.length).to(eq(0), format_warnings(brakeman_warnings, "controllers"))
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns zero high confidence model warnings", :security do
|
24
|
+
brakeman_warnings = checks.model_warnings
|
25
|
+
expect(brakeman_warnings.length).to(eq(0), format_warnings(brakeman_warnings, "models"))
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns zero high confidence template warnings", :security do
|
29
|
+
brakeman_warnings = checks.template_warnings
|
30
|
+
expect(brakeman_warnings.length).to(eq(0), format_warnings(brakeman_warnings, "templates"))
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns zero high confidence other warnings", :security do
|
34
|
+
brakeman_warnings = checks.warnings
|
35
|
+
expect(brakeman_warnings.length).to(eq(0), format_warnings(brakeman_warnings, "other"))
|
36
|
+
end
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
ENV["RAILS_ENV"] ||= 'test'
|
2
|
+
require 'simplecov'
|
3
|
+
require 'coveralls'
|
4
|
+
Coveralls.wear!('rails')
|
5
|
+
SimpleCov.start('rails')
|
6
|
+
|
7
|
+
require File.expand_path("../../config/environment", __FILE__)
|
8
|
+
|
9
|
+
require 'capybara/rspec'
|
10
|
+
require 'capybara-screenshot/rspec'
|
11
|
+
require 'capybara/email/rspec'
|
12
|
+
require 'database_cleaner'
|
13
|
+
require 'rspec/collection_matchers'
|
14
|
+
require 'rspec/rails'
|
15
|
+
require 'vcr'
|
16
|
+
require 'webmock/rspec'
|
17
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
18
|
+
|
19
|
+
Capybara.asset_host = 'http://localhost:3000'
|
20
|
+
Capybara.javascript_driver = :webkit
|
21
|
+
|
22
|
+
RSpec.configure do |config|
|
23
|
+
#config.extend VCR::RSpec::Macros
|
24
|
+
config.include Capybara::DSL
|
25
|
+
config.include FactoryGirl::Syntax::Methods
|
26
|
+
|
27
|
+
config.order = 'random'
|
28
|
+
|
29
|
+
config.infer_spec_type_from_file_location!
|
30
|
+
config.raise_errors_for_deprecations!
|
31
|
+
|
32
|
+
config.mock_with(:rspec) { |c| c.syntax = [:expect] }
|
33
|
+
|
34
|
+
config.before(:suite) do
|
35
|
+
DatabaseCleaner.strategy = :transaction
|
36
|
+
DatabaseCleaner.clean_with(:truncation)
|
37
|
+
end
|
38
|
+
|
39
|
+
config.before(:each) do
|
40
|
+
DatabaseCleaner.start
|
41
|
+
end
|
42
|
+
|
43
|
+
config.after(:each) do
|
44
|
+
DatabaseCleaner.clean
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
if ENV['CI']
|
49
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
50
|
+
else
|
51
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ]
|
52
|
+
end
|
53
|
+
|
54
|
+
VCR.configure do |c|
|
55
|
+
c.cassette_library_dir = 'spec/fixtures'
|
56
|
+
c.hook_into :webmock # or :fakeweb
|
57
|
+
c.default_cassette_options = { record: :new_episodes }
|
58
|
+
c.configure_rspec_metadata!
|
59
|
+
end
|
60
|
+
|
61
|
+
WebMock.disable_net_connect!(allow_localhost: true)
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module LoginHelpers
|
2
|
+
|
3
|
+
def login_user(user = create(:user, email: 'user@example.com', password: 'Mahalo43', password_confirmation: 'Mahalo43'))
|
4
|
+
visit answers.new_user_session_path
|
5
|
+
fill_in 'Email', with: user.email
|
6
|
+
fill_in 'Password', with: user.password
|
7
|
+
click_button 'Sign in'
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# This code courtesy of art.ly
|
2
|
+
# http://www.webcitation.org/68jfoNAWt
|
3
|
+
def wait_for_dom(timeout = Capybara.default_wait_time)
|
4
|
+
uuid = SecureRandom.uuid
|
5
|
+
page.find("body")
|
6
|
+
page.evaluate_script <<-EOS
|
7
|
+
_.defer(function() {
|
8
|
+
$('body').append("<div id='#{uuid}'></div>");
|
9
|
+
});
|
10
|
+
EOS
|
11
|
+
page.find("##{uuid}")
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe "questions/index", :type => :view do
|
4
|
+
before(:each) do
|
5
|
+
assign(:questions, [
|
6
|
+
Answers::Question.create!(),
|
7
|
+
Answers::Question.create!()
|
8
|
+
])
|
9
|
+
end
|
10
|
+
|
11
|
+
it "renders a list of questions" do
|
12
|
+
pending 'Need to update for new engine layout.'
|
13
|
+
|
14
|
+
render
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe "questions/show", :type => :view do
|
4
|
+
before(:each) do
|
5
|
+
@question = assign(:question, Answers::Question.create!())
|
6
|
+
end
|
7
|
+
|
8
|
+
it "renders attributes in <p>" do
|
9
|
+
pending 'Need to update for new engine layout.'
|
10
|
+
|
11
|
+
render
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|