From 679f1b4e970a1a3b7aa913eb40d87c6a6915fc57 Mon Sep 17 00:00:00 2001 From: Rodrigo Pavano Date: Mon, 25 Jul 2016 14:58:54 -0300 Subject: [PATCH] Add ability to archive pages (#588) * Add ability to archive pages * Refactored Page#active boolean flag to be a Page#publish_status, which is an enum with 3 possible statuses. * Add ability to archive and unarchive pages. * Add ability to search pages filtering by `publish_status * Add confirm pop-up to archive link * Use new enum on page service class --- app/assets/javascripts/plugins_toggle.js | 6 +-- app/controllers/page_archives_controller.rb | 14 +++++++ app/controllers/pages_controller.rb | 14 +++++-- app/helpers/pages_helper.rb | 8 ++++ app/models/page.rb | 3 +- app/services/search/page_searcher.rb | 8 +++- app/views/api/pages/index.json.jbuilder | 2 +- app/views/api/pages/show.json.jbuilder | 4 +- app/views/pages/_campaigner_overlay.slim | 4 +- app/views/pages/_edit_sidebar.slim | 8 ++-- app/views/pages/_search.slim | 6 +++ app/views/pages/index.slim | 14 +++++-- config/locales/champaign.en.yml | 5 ++- config/routes.rb | 2 + ...60720045351_add_publish_status_to_pages.rb | 19 ++++++++++ db/schema.rb | 3 +- spec/controllers/pages_controller_spec.rb | 22 +++++------ spec/factories/pages.rb | 10 ++++- spec/models/page_spec.rb | 8 ++-- spec/rails_helper.rb | 2 + spec/requests/api/pages_spec.rb | 10 ++--- spec/requests/page_archives_spec.rb | 37 +++++++++++++++++++ spec/routing/page_archives_routing_spec.rb | 15 ++++++++ spec/services/page_service_spec.rb | 14 +++---- spec/services/page_updater_spec.rb | 28 ++++++++------ .../multiple_search_data.rb | 29 +++++++-------- .../multiple_search_spec.rb | 6 +-- .../page_searcher/page_searcher_spec.rb | 11 ++---- .../order_by_search_spec.rb | 36 +++++++++--------- .../search_by_campaign_spec.rb | 20 +++++----- .../search_by_language_spec.rb | 20 +++++----- .../search_by_layout_spec.rb | 20 +++++----- .../search_by_plugin_spec.rb | 18 ++++----- .../search_by_tag_spec.rb | 32 ++++++++-------- .../search_by_text_content_spec.rb | 2 +- spec/views/shared_examples.rb | 2 +- 36 files changed, 298 insertions(+), 164 deletions(-) create mode 100644 app/controllers/page_archives_controller.rb create mode 100644 db/migrate/20160720045351_add_publish_status_to_pages.rb create mode 100644 spec/requests/page_archives_spec.rb create mode 100644 spec/routing/page_archives_routing_spec.rb diff --git a/app/assets/javascripts/plugins_toggle.js b/app/assets/javascripts/plugins_toggle.js index 431757e3e..9f9195a9f 100644 --- a/app/assets/javascripts/plugins_toggle.js +++ b/app/assets/javascripts/plugins_toggle.js @@ -14,11 +14,11 @@ const setupOnce = require('setup_once'); initialize: function(){ this.$stateInput = this.$('.activation-toggle-field'); this.$checkbox = this.$('.onoffswitch__checkbox'); - this.state = JSON.parse(this.$stateInput.val()); + this.state = this.$stateInput.val(); }, handleClick: function(e){ - if (this.state == true && this.$stateInput.data('confirm-turning-off')){ + if (this.state == 'published' && this.$stateInput.data('confirm-turning-off')){ if (!window.confirm(this.$stateInput.data('confirm-turning-off'))) { this.toggleButton(); return false; @@ -40,7 +40,7 @@ const setupOnce = require('setup_once'); }, toggleState: function(){ - this.state = !this.state; + this.state = this.state === 'published' ? 'unpublished' : 'published'; this.$stateInput.val(this.state); }, }); diff --git a/app/controllers/page_archives_controller.rb b/app/controllers/page_archives_controller.rb new file mode 100644 index 000000000..ac231a473 --- /dev/null +++ b/app/controllers/page_archives_controller.rb @@ -0,0 +1,14 @@ +class PageArchivesController < ApplicationController + before_action :authenticate_user! + def create + @page = Page.find(params[:page_id]) + @page.archived! + redirect_to pages_path, notice: 'Page was successfully archived.' + end + + def destroy + @page = Page.find(params[:page_id]) + @page.unpublished! + redirect_to pages_path, notice: 'Page was successfully unarchived.' + end +end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 38bf657d5..a88701f2f 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -7,9 +7,8 @@ class PagesController < ApplicationController before_action :get_page_or_homepage, only: [:show] def index - # Filter the desired pages by search parameters, and sort them descending by their date of update. - @pages = Search::PageSearcher.new(params).search.sort_by(&:updated_at).reverse! - @search_params = params[:search].present? ? params[:search] : {} + @search_params = search_params + @pages = Search::PageSearcher.new(@search_params).search.sort_by(&:updated_at).reverse! end def analytics @@ -59,7 +58,7 @@ def update private def render_liquid(layout, view) - return redirect_to(Settings.homepage_url) unless @page.active? || user_signed_in? + return redirect_to(Settings.homepage_url) unless @page.published? || user_signed_in? localize_by_page_language(@page) @rendered = renderer(layout).render @@ -105,5 +104,12 @@ def page_params :follow_up_liquid_layout_id, {:tag_ids => []} ) end + + def search_params + default_params = { publish_status: Page.publish_statuses.values_at(:published, :unpublished) } + params[:search] ||= {} + params[:search].reverse_merge default_params + end + end diff --git a/app/helpers/pages_helper.rb b/app/helpers/pages_helper.rb index 5ff0e0125..6d3db4da9 100644 --- a/app/helpers/pages_helper.rb +++ b/app/helpers/pages_helper.rb @@ -136,4 +136,12 @@ def share_card(page) image: Image.find_by(id: share.image_id).try(:content).try(:url) } end + + def archive_confirm_message(page) + msg = "Are you sure you want to archive this page?" + if page.published? + msg += " It will also be unpublished making it inaccessible except to logged-in campaigners." + end + msg + end end diff --git a/app/models/page.rb b/app/models/page.rb index d3c5227c4..536c285ab 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -3,6 +3,7 @@ class Page < ActiveRecord::Base has_paper_trail enum follow_up_plan: [:with_liquid, :with_page] # todo - :with_link + enum publish_status: [:published, :unpublished, :archived] belongs_to :language belongs_to :campaign # Note that some pages do not necessarily belong to campaigns @@ -18,11 +19,11 @@ class Page < ActiveRecord::Base has_many :links, dependent: :destroy scope :language, -> (code) { code ? joins(:language).where(languages: { code: code }) : all } - scope :published, -> { where(active: true) } scope :featured, -> { where(featured: true) } validates :title, presence: true validates :liquid_layout, presence: true + validates :publish_status, presence: true validate :primary_image_is_owned after_save :switch_plugins diff --git a/app/services/search/page_searcher.rb b/app/services/search/page_searcher.rb index 173addb08..5dec8ca70 100644 --- a/app/services/search/page_searcher.rb +++ b/app/services/search/page_searcher.rb @@ -1,7 +1,7 @@ class Search::PageSearcher def initialize(params) - @queries = params[:search] + @queries = params @collection = Page.all end @@ -23,6 +23,8 @@ def search search_by_campaign(query) when 'plugin_type' search_by_plugin_type(query) + when 'publish_status' + search_by_publish_status(query) when 'order_by' order_by(query) end @@ -109,6 +111,10 @@ def search_by_plugin_type(query) @collection = @collection.where(id: matches_by_plugins) end + def search_by_publish_status(query) + @collection = @collection.where(publish_status: query) + end + def order_by(query) if validate_order_by(query) if query.is_a? Array diff --git a/app/views/api/pages/index.json.jbuilder b/app/views/api/pages/index.json.jbuilder index 90b330a4e..3fce42022 100644 --- a/app/views/api/pages/index.json.jbuilder +++ b/app/views/api/pages/index.json.jbuilder @@ -1,4 +1,4 @@ json.array! @pages do |page| - json.extract! page, :id, :title, :slug, :content, :created_at, :updated_at, :active, :featured, :action_count + json.extract! page, :id, :title, :slug, :content, :created_at, :updated_at, :publish_status, :featured, :action_count json.language page.language.code end diff --git a/app/views/api/pages/show.json.jbuilder b/app/views/api/pages/show.json.jbuilder index 1d3201b1e..f9b9892e1 100644 --- a/app/views/api/pages/show.json.jbuilder +++ b/app/views/api/pages/show.json.jbuilder @@ -1,2 +1,2 @@ -json.extract! @page, :id, :title, :slug, :content, :created_at, :updated_at, :active, :featured, :action_count -json.language @page.language.code \ No newline at end of file +json.extract! @page, :id, :title, :slug, :content, :created_at, :updated_at, :publish_status, :featured, :action_count +json.language @page.language.code diff --git a/app/views/pages/_campaigner_overlay.slim b/app/views/pages/_campaigner_overlay.slim index ec57c6eda..2f82a5d99 100644 --- a/app/views/pages/_campaigner_overlay.slim +++ b/app/views/pages/_campaigner_overlay.slim @@ -1,5 +1,5 @@ - if user_signed_in? && page.present? - .campaigner-overlay.mobile-hide class="#{page.active? ? 'campaigner-overlay--active' : 'campaigner-overlay--inactive'}" data-status="#{page.active? ? 'active' : 'inactive'}" + .campaigner-overlay.mobile-hide class="#{page.published? ? 'campaigner-overlay--active' : 'campaigner-overlay--inactive'}" data-status="#{page.published? ? 'active' : 'inactive'}" .campaigner-overlay__close.fa.fa-close .campaigner-overlay__status.campaigner-overlay__info--active | Published @@ -13,7 +13,7 @@ = form_for page, url: api_page_path(page), remote: true do |ff| / we have nested page[page][active] to match the massive nested form submitted with the one-form = ff.fields_for :page do |f| - = f.hidden_field :active, class: 'campaigner-overlay__publish-field', value: !page.active? + = f.hidden_field :publish_status, class: 'campaigner-overlay__publish-field', value: page.published? ? "unpublished" : "published" = f.submit "Publish", class: 'campaigner-overlay__toggle-publish campaigner-overlay__info--inactive' = f.submit "Unpublish", class: 'campaigner-overlay__toggle-publish campaigner-overlay__info--active', 'data-confirm' => "Are you sure you want to unpublish this page? It will become inaccessible except to logged-in campaigners." = link_to 'Edit', edit_page_path(page), class: 'campaigner-overlay__edit-link' diff --git a/app/views/pages/_edit_sidebar.slim b/app/views/pages/_edit_sidebar.slim index e9750d9da..d372c5dba 100644 --- a/app/views/pages/_edit_sidebar.slim +++ b/app/views/pages/_edit_sidebar.slim @@ -10,16 +10,16 @@ .page-edit-bar__save-box .page-edit-bar__toggle .page-edit-bar__toggle-title Autosave - .page-edit-bar__toggle-btns.page-edit-bar__toggle-autosave data-autosave="#{!page.active?}" - = render 'shared/binary_switch', checked: !page.active? + .page-edit-bar__toggle-btns.page-edit-bar__toggle-autosave data-autosave="#{!page.published?}" + = render 'shared/binary_switch', checked: !page.published? .page-edit-bar__toggle = form_for page, url: api_page_path(page), remote: true, html: {class: 'activation-toggle'} do |ff| / we have nested page[page][active] to match the massive nested form submitted with the one-form = ff.fields_for :page do |f| - = f.hidden_field :active, class: 'activation-toggle-field', value: page.active?, "data-confirm-turning-off" => "Are you sure you want to unpublish this page? It will become inaccessible except to logged-in campaigners." + = f.hidden_field :publish_status, class: 'activation-toggle-field', value: page.publish_status, "data-confirm-turning-off" => "Are you sure you want to unpublish this page? It will become inaccessible except to logged-in campaigners." .page-edit-bar__toggle-title Publish .page-edit-bar__toggle-btns - = render 'shared/binary_switch', checked: page.active? + = render 'shared/binary_switch', checked: page.published? .page-edit-bar__last-saved .page-edit-bar__error-message .page-edit-bar__btn-holder.page-edit-bar__btn-holder--hidden diff --git a/app/views/pages/_search.slim b/app/views/pages/_search.slim index 18e86c235..dd22c676f 100644 --- a/app/views/pages/_search.slim +++ b/app/views/pages/_search.slim @@ -34,6 +34,12 @@ @search_params[:plugin_type]), html_options= {class: 'selectize-container', multiple: true} + .page-filter__row + = label_tag 'search[publish_status]', 'Publish status:', class: 'control-label col-lg-3' + .col-lg-3 + = select_tag 'search[publish_status]', options_for_select(Page.publish_statuses.to_a, @search_params[:publish_status]), + html_options= {class: 'selectize-container', multiple: true} + .col-md-12 = submit_tag 'Filter by these criteria', class: 'btn btn-primary page-filter__submit', id: 'search_button' = button_tag 'Reset filters', type: 'button', class: 'btn btn-danger page-filter__reset', id: 'filter_reset_button' diff --git a/app/views/pages/index.slim b/app/views/pages/index.slim index 8ab8626bb..63bff4b67 100644 --- a/app/views/pages/index.slim +++ b/app/views/pages/index.slim @@ -21,18 +21,26 @@ th th th + th tbody - @pages.each do |page| tr td = page.title - td = page.active? ? t('.published') : t('.unpublished') + td = t('.' + page.publish_status) td = page.created_at.strftime('%Y-%b-%d') td = page.updated_at.strftime('%Y-%b-%d') td = page.action_count td = link_to t('pages.edit.view'), member_facing_page_path(page) - td = link_to t('common.edit'), edit_page_path(page) + td = link_to_if !page.archived?, t('common.edit'), edit_page_path(page) td = link_to t('.stats'), analytics_page_path(page) - td = link_to t('menu.clone'), new_clone_page_path(id: page.id) + td = link_to_if !page.archived?, t('menu.clone'), new_clone_page_path(id: page.id) + td + - if page.archived? + = link_to t('pages.index.unarchive'), page_archive_path(page), method: :delete + - else + = link_to t('pages.index.archive'), page_archive_path(page), method: :post, 'data-confirm' => archive_confirm_message(page) + + #search-filter = render partial: 'search' diff --git a/config/locales/champaign.en.yml b/config/locales/champaign.en.yml index 1ced77b87..96ec89753 100644 --- a/config/locales/champaign.en.yml +++ b/config/locales/champaign.en.yml @@ -110,12 +110,15 @@ en: title: "Pages" filter: "Advanced Search" stats: "Stats" - publish_status: "Published?" + publish_status: "Publish status" published: 'Published' unpublished: 'Private' + archived: 'Archived' action_count: 'Actions' table: featured: "Featured" + archive: "Archive" + unarchive: "Unarchive" new: title: "Let's Get Started!" title_label: "Page Title" diff --git a/config/routes.rb b/config/routes.rb index 099cc0d2c..16ae3db5e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -53,6 +53,8 @@ resources :images get 'plugins', to: 'plugins#index' get 'plugins/:type/:id', to: 'plugins#show', as: 'plugin' + + resource :archive, only: [:create, :destroy], controller: 'page_archives' end resources :pages, path: 'a', as: 'member_facing_page', only: [:edit, :show] do diff --git a/db/migrate/20160720045351_add_publish_status_to_pages.rb b/db/migrate/20160720045351_add_publish_status_to_pages.rb new file mode 100644 index 000000000..95224347b --- /dev/null +++ b/db/migrate/20160720045351_add_publish_status_to_pages.rb @@ -0,0 +1,19 @@ +class AddPublishStatusToPages < ActiveRecord::Migration + class Page < ActiveRecord::Base + end + + def up + add_column :pages, :publish_status, :integer, default: 1, null: false + add_index :pages, :publish_status + Page.where(active: true).update_all(publish_status: 0) + Page.where(active: false).update_all(publish_status: 1) + remove_column :pages, :active + end + + def down + add_column :pages, :active, :boolean, default: false + add_index :pages, :active + remove_column :pages, :publish_status + end +end + diff --git a/db/schema.rb b/db/schema.rb index 9d5ced28e..aadd11a13 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -189,7 +189,6 @@ t.text "messages" t.text "content", default: "" t.boolean "featured", default: false - t.boolean "active", default: false t.integer "liquid_layout_id" t.integer "follow_up_liquid_layout_id" t.integer "action_count", default: 0 @@ -199,12 +198,14 @@ t.integer "follow_up_plan", default: 0, null: false t.integer "follow_up_page_id" t.text "javascript" + t.integer "publish_status", default: 1, null: false end add_index "pages", ["follow_up_liquid_layout_id"], name: "index_pages_on_follow_up_liquid_layout_id", using: :btree add_index "pages", ["follow_up_page_id"], name: "index_pages_on_follow_up_page_id", using: :btree add_index "pages", ["liquid_layout_id"], name: "index_pages_on_liquid_layout_id", using: :btree add_index "pages", ["primary_image_id"], name: "index_pages_on_primary_image_id", using: :btree + add_index "pages", ["publish_status"], name: "index_pages_on_publish_status", using: :btree create_table "pages_tags", force: :cascade do |t| t.integer "page_id" diff --git a/spec/controllers/pages_controller_spec.rb b/spec/controllers/pages_controller_spec.rb index 971eb68b2..9ab8de600 100644 --- a/spec/controllers/pages_controller_spec.rb +++ b/spec/controllers/pages_controller_spec.rb @@ -4,7 +4,7 @@ let(:user) { instance_double('User', id: '1') } let(:default_language) { instance_double(Language, code: :en) } let(:language) { instance_double(Language, code: :fr) } - let(:page) { instance_double('Page', active?: true, featured?: true, id: '1', liquid_layout: '3', follow_up_liquid_layout: '4', language: default_language) } + let(:page) { instance_double('Page', published?: true, featured?: true, id: '1', liquid_layout: '3', follow_up_liquid_layout: '4', language: default_language) } let(:renderer) { instance_double('LiquidRenderer', render: 'my rendered html', personalization_data: { some: 'data'}) } before do @@ -142,25 +142,25 @@ it 'redirects to homepage if user not logged in and page unpublished' do allow(controller).to receive(:user_signed_in?) { false } - allow(page).to receive(:active?){ false } + allow(page).to receive(:published?){ false } expect( get :show, id: '1' ).to redirect_to(Settings.homepage_url) end it 'does not redirect to homepage if user not logged in and page published' do allow(controller).to receive(:user_signed_in?) { false } - allow(page).to receive(:active?){ true } + allow(page).to receive(:published?){ true } expect( get :show, id: '1' ).not_to be_redirect end it 'does not redirect to homepage if user logged in and page unpublished' do allow(controller).to receive(:user_signed_in?) { true } - allow(page).to receive(:active?){ false } + allow(page).to receive(:published?){ false } expect( get :show, id: '1' ).not_to be_redirect end it 'does not redirect to homepage if user logged in and page published' do allow(controller).to receive(:user_signed_in?) { true } - allow(page).to receive(:active?){ true } + allow(page).to receive(:published?){ true } expect( get :show, id: '1' ).not_to be_redirect end @@ -170,8 +170,8 @@ end context 'on pages with localization' do - let(:french_page) { instance_double(Page, valid?: true, active?: true, language: language, id: '42', liquid_layout: '5') } - let(:english_page) { instance_double(Page, valid?: true, active?: true, language: default_language, id: '66', liquid_layout: '5') } + let(:french_page) { instance_double(Page, valid?: true, published?: true, language: language, id: '42', liquid_layout: '5') } + let(:english_page) { instance_double(Page, valid?: true, published?: true, language: default_language, id: '66', liquid_layout: '5') } context 'with french' do subject { french_page } @@ -250,28 +250,28 @@ it 'redirects to homepage if user not logged in and page unpublished' do subject allow(controller).to receive(:user_signed_in?) { false } - allow(page).to receive(:active?){ false } + allow(page).to receive(:published?){ false } expect( get :follow_up, id: '1' ).to redirect_to(Settings.homepage_url) end it 'does not redirect to homepage if user not logged in and page published' do subject allow(controller).to receive(:user_signed_in?) { false } - allow(page).to receive(:active?){ true } + allow(page).to receive(:published?){ true } expect( get :follow_up, id: '1' ).not_to be_redirect end it 'does not redirect to homepage if user logged in and page unpublished' do subject allow(controller).to receive(:user_signed_in?) { true } - allow(page).to receive(:active?){ false } + allow(page).to receive(:published?){ false } expect( get :follow_up, id: '1' ).not_to be_redirect end it 'does not redirect to homepage if user logged in and page published' do subject allow(controller).to receive(:user_signed_in?) { true } - allow(page).to receive(:active?){ true } + allow(page).to receive(:published?){ true } expect( get :follow_up, id: '1' ).not_to be_redirect end diff --git a/spec/factories/pages.rb b/spec/factories/pages.rb index 7defd6514..bb19c18eb 100644 --- a/spec/factories/pages.rb +++ b/spec/factories/pages.rb @@ -2,12 +2,20 @@ factory :page do sequence(:title) {|n| "#{Faker::Company.bs}#{n.to_s}" } slug nil # Used by friendly_id http://norman.github.io/friendly_id/ - active true + publish_status :published featured false liquid_layout language ak_petition_resource_uri "http://example.com/petition" ak_donation_resource_uri "http://example.com/donation" + + trait :published do + publish_status :published + end + + trait :unpublished do + publish_status :unpublished + end end end diff --git a/spec/models/page_spec.rb b/spec/models/page_spec.rb index d9fe21eb2..abd6814f3 100644 --- a/spec/models/page_spec.rb +++ b/spec/models/page_spec.rb @@ -18,7 +18,7 @@ it { is_expected.to be_valid } it { is_expected.to respond_to :title } it { is_expected.to respond_to :slug } - it { is_expected.to respond_to :active } + it { is_expected.to respond_to :publish_status } it { is_expected.to respond_to :featured } it { is_expected.to respond_to :tags } it { is_expected.to respond_to :pages_tags } @@ -384,10 +384,10 @@ describe 'scopes' do describe 'published' do - let!(:published_page) { create(:page, active: true) } - let!(:page) { create(:page, active: false) } + let!(:published_page) { create(:page, publish_status: 'published') } + let!(:page) { create(:page, publish_status: 'unpublished') } - it 'returns published (active) pages' do + it 'returns published pages' do expect(Page.published).to eq([published_page]) end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 4d8c70a65..8c2bba182 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -68,6 +68,7 @@ config.include Devise::TestHelpers, type: :controller config.extend ControllerMacros, type: :controller + config.include Warden::Test::Helpers, type: :request # RSpec Rails can automatically mix in different behaviours to your tests # based on their file location, for example enabling you to call `get` and @@ -88,6 +89,7 @@ config.before(:suite) do DatabaseCleaner.strategy = :transaction DatabaseCleaner.clean_with(:truncation) + Warden.test_mode! end config.around(:each) do |example| diff --git a/spec/requests/api/pages_spec.rb b/spec/requests/api/pages_spec.rb index 0513c9347..dc7a75c92 100644 --- a/spec/requests/api/pages_spec.rb +++ b/spec/requests/api/pages_spec.rb @@ -7,7 +7,7 @@ def json describe 'GET index' do before do - create(:page, active: true, title: 'Foo', content: 'Bar') + create(:page, :published, title: 'Foo', content: 'Bar') end subject { JSON.parse(response.body) } @@ -18,7 +18,7 @@ def json expect(subject.size).to eq(1) expect(subject.first.keys).to match( - %w{id title slug content created_at updated_at active featured action_count language} + %w{id title slug content created_at updated_at publish_status featured action_count language} ) expect(subject.first.symbolize_keys).to include({ @@ -30,7 +30,7 @@ def json describe 'GET featured' do before do - create(:page, featured: true, active: true, title: 'Foo', content: 'Bar') + create(:page, :published, featured: true, title: 'Foo', content: 'Bar') create(:page, featured: false) end @@ -42,7 +42,7 @@ def json expect(subject.size).to eq(1) expect(subject.first.keys).to match( - %w{id title slug content created_at updated_at active featured action_count language} + %w{id title slug content created_at updated_at publish_status featured action_count language} ) expect(subject.first.symbolize_keys).to include({ @@ -61,7 +61,7 @@ def json it 'returns page' do expect(subject.keys).to match( - %w{id title slug content created_at updated_at active featured action_count language} + %w{id title slug content created_at updated_at publish_status featured action_count language} ) expect(subject.symbolize_keys).to include({ diff --git a/spec/requests/page_archives_spec.rb b/spec/requests/page_archives_spec.rb new file mode 100644 index 000000000..8b4b89ea4 --- /dev/null +++ b/spec/requests/page_archives_spec.rb @@ -0,0 +1,37 @@ +require 'rails_helper' + +describe "Page archiving", type: :request do + before do + login_as(create(:user), scope: :user) + end + + describe "POST /page/:id/archive" do + let!(:page) { create(:page, publish_status: 'published') } + + it "archives the page" do + post "/pages/#{page.id}/archive" + page.reload + expect(page.publish_status).to eql("archived") + end + + it "redirects to index page" do + post "/pages/#{page.id}/archive" + expect(response).to redirect_to pages_path + end + end + + describe "DELETE /page/:id/archive" do + let!(:page) { create(:page, publish_status: 'published') } + + it "unarchives the page" do + delete "/pages/#{page.id}/archive" + page.reload + expect(page.publish_status).to eql("unpublished") + end + + it "redirects to index page" do + post "/pages/#{page.id}/archive" + expect(response).to redirect_to pages_path + end + end +end diff --git a/spec/routing/page_archives_routing_spec.rb b/spec/routing/page_archives_routing_spec.rb new file mode 100644 index 000000000..29f0401e4 --- /dev/null +++ b/spec/routing/page_archives_routing_spec.rb @@ -0,0 +1,15 @@ +require "rails_helper" + +describe PageArchivesController, type: :routing do + describe "routing" do + describe 'with /pages/:id/archive' do + it "routes to #create" do + expect(:post => "/pages/123/archive").to route_to("page_archives#create", page_id: '123') + end + + it "routes to #destroy" do + expect(:delete => "/pages/123/archive").to route_to("page_archives#destroy", page_id: '123') + end + end + end +end diff --git a/spec/services/page_service_spec.rb b/spec/services/page_service_spec.rb index 5c8c5fa02..d9933abd5 100644 --- a/spec/services/page_service_spec.rb +++ b/spec/services/page_service_spec.rb @@ -2,9 +2,9 @@ describe PageService do describe '.list' do - let!(:en_page) { create(:page, active: true, language: create(:language, :english), created_at: 1.year.ago) } - let!(:en_unpublished) { create(:page, active: false, language: create(:language, :english)) } - let!(:fr_page) { create(:page, active: true, language: create(:language, :french)) } + let!(:en_page) { create(:page, :published, language: create(:language, :english), created_at: 1.year.ago) } + let!(:en_unpublished) { create(:page, :unpublished, language: create(:language, :english)) } + let!(:fr_page) { create(:page, :published, language: create(:language, :french)) } it 'returns pages by language' do expect(subject.list(language: 'fr')).to match_array([fr_page]) @@ -29,10 +29,10 @@ end describe '.list_featured' do - let!(:en_page) { create(:page, active: true, featured: true, language: create(:language, :english), created_at: 1.year.ago) } - let!(:en_unpublished) { create(:page, active: false, language: create(:language, :english)) } - let!(:en_unfeatured) { create(:page, active: true, language: create(:language, :english)) } - let!(:fr_page) { create(:page, active: true, featured: true, language: create(:language, :french)) } + let!(:en_page) { create(:page, :published, featured: true, language: create(:language, :english), created_at: 1.year.ago) } + let!(:en_unpublished) { create(:page, :unpublished, language: create(:language, :english)) } + let!(:en_unfeatured) { create(:page, :published, language: create(:language, :english)) } + let!(:fr_page) { create(:page, :published, featured: true, language: create(:language, :french)) } it 'returns featured pages by language' do expect(subject.list_featured(language: 'en')).to match_array([en_page]) diff --git a/spec/services/page_updater_spec.rb b/spec/services/page_updater_spec.rb index d3252157a..772e405f6 100644 --- a/spec/services/page_updater_spec.rb +++ b/spec/services/page_updater_spec.rb @@ -137,22 +137,26 @@ expect{ pupdater.update(params) }.to raise_error ActiveRecord::RecordNotFound end - it 'updates the page active to true' do - page.active = false - page.save - expect(page.reload.active).to eq false - params = {page: {active: true} } + it 'updates the publish status to "published"' do + page.publish_status = 'unpublished' + page.save! + params = {page: {publish_status: 'published'} } expect( pupdater.update(params) ).to eq true - expect( page.reload.active).to eq true + expect( page.reload.publish_status).to eq 'published' end - it 'updates the page active to false' do - page.active = true - page.save - expect(page.reload.active).to eq true - params = {page: {active: false} } + it 'updates the pulish status to "unpublished"' do + page.publish_status = 'published' + page.save! + params = {page: {publish_status: 'unpublished'} } expect( pupdater.update(params) ).to eq true - expect( page.reload.active).to eq false + expect( page.reload.publish_status).to eq 'unpublished' + end + + it 'updates the pulish status to "archived"' do + params = {page: {publish_status: 'archived'} } + expect( pupdater.update(params) ).to eq true + expect( page.reload.publish_status).to eq 'archived' end describe 'shares' do diff --git a/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_data.rb b/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_data.rb index 85495c083..761f00810 100644 --- a/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_data.rb +++ b/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_data.rb @@ -30,35 +30,32 @@ } let(:content_tag_language_params) { - { search: { - content_search: 'multimatch', - tags: [tag.id], - language: language.id - } + { + content_search: 'multimatch', + tags: [tag.id], + language: language.id } } let(:content_language_campaign_tags_params) { - { search: { - content_search: 'multimatch', - language: language.id, - campaign: campaign, - tags: [tag.id] - } + { + content_search: 'multimatch', + language: language.id, + campaign: campaign, + tags: [tag.id] } } let(:layout_tags_searcher_params) { - { search: { - tags: [tag.id], - layout: layout - } + { + tags: [tag.id], + layout: layout } } let(:content_language_campaign_tags_searcher) { Search::PageSearcher.new(content_language_campaign_tags_params) } let(:content_tag_language_searcher) { Search::PageSearcher.new(content_tag_language_params) } - let(:layout_searcher) { Search::PageSearcher.new({search: {layout: [create(:liquid_layout, title:'tricky layout')]} }) } + let(:layout_searcher) { Search::PageSearcher.new(layout: [create(:liquid_layout, title:'tricky layout')]) } let(:layout_tags_searcher) { Search::PageSearcher.new(layout_tags_searcher_params) } end diff --git a/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_spec.rb b/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_spec.rb index a1df47eab..ffeeaec06 100644 --- a/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_spec.rb +++ b/spec/services/search/page_searcher/multiple_criterion_search/multiple_search_spec.rb @@ -27,9 +27,9 @@ context 'uses OR queries for categories where it makes sense (campaign, language) and not for other categories' do - let(:finds_pages_for_all_campaigns) { Search::PageSearcher.new({ search: {campaign: [campaign.id, campaign2.id]} }) } - let(:impossible_tag_searcher) { Search::PageSearcher.new({ search: {tags: Tag.all.pluck('id').push(Tag.last.id+1)} }) } - let(:campaign_language_searcher) { Search::PageSearcher.new({ search: {language: language, campaign: Campaign.all.pluck('id')} }) } + let(:finds_pages_for_all_campaigns) { Search::PageSearcher.new(campaign: [campaign.id, campaign2.id]) } + let(:impossible_tag_searcher) { Search::PageSearcher.new(tags: Tag.all.pluck('id').push(Tag.last.id+1)) } + let(:campaign_language_searcher) { Search::PageSearcher.new(language: language, campaign: Campaign.all.pluck('id')) } it 'finds all pages that match the specified array of campaigns' do expect(finds_pages_for_all_campaigns.search).to match_array([ diff --git a/spec/services/search/page_searcher/page_searcher_spec.rb b/spec/services/search/page_searcher/page_searcher_spec.rb index 44c454774..536b401db 100644 --- a/spec/services/search/page_searcher/page_searcher_spec.rb +++ b/spec/services/search/page_searcher/page_searcher_spec.rb @@ -8,19 +8,16 @@ context 'validates search parameters' do describe 'returns all pages when searching' do it 'with an empty array' do - expect(Search::PageSearcher.new({search: [] }).search).to match_array(Page.all) + expect(Search::PageSearcher.new([]).search).to match_array(Page.all) end it 'with nil' do - expect(Search::PageSearcher.new({search: nil }).search).to match_array(Page.all) + expect(Search::PageSearcher.new(nil).search).to match_array(Page.all) end it 'with a non-existent search type' do - expect(Search::PageSearcher.new({search: {inject_some_sql: "MaliciousCampaign');DROP TABLE Campaigns;--"} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new(inject_some_sql: "MaliciousCampaign');DROP TABLE Campaigns;--").search).to match_array(Page.all) end it 'with an empty string' do - expect(Search::PageSearcher.new({search: '' }).search).to match_array(Page.all) - end - it 'with no search parameters' do - expect(Search::PageSearcher.new({}).search).to match_array(Page.all) + expect(Search::PageSearcher.new('').search).to match_array(Page.all) end end end diff --git a/spec/services/search/page_searcher/single_criterion_search/order_by_search_spec.rb b/spec/services/search/page_searcher/single_criterion_search/order_by_search_spec.rb index 93c6c625b..918c7f30a 100644 --- a/spec/services/search/page_searcher/single_criterion_search/order_by_search_spec.rb +++ b/spec/services/search/page_searcher/single_criterion_search/order_by_search_spec.rb @@ -9,37 +9,37 @@ let(:page_searcher) {Search::PageSearcher} it 'orders searches based on creation date' do - expect(page_searcher.new(search: {order_by: [:created_at, :asc]}).search).to eq(Page.all.order(created_at: :asc)) - expect(page_searcher.new(search: {order_by: [:created_at, :desc]}).search).to eq(Page.all.order(created_at: :desc)) - expect(page_searcher.new(search: {order_by: :created_at}).search).to eq(Page.all.order(created_at: :asc)) + expect(page_searcher.new({order_by: [:created_at, :asc]}).search).to eq(Page.all.order(created_at: :asc)) + expect(page_searcher.new({order_by: [:created_at, :desc]}).search).to eq(Page.all.order(created_at: :desc)) + expect(page_searcher.new({order_by: :created_at}).search).to eq(Page.all.order(created_at: :asc)) end it 'orders searches based on update date' do - expect(page_searcher.new(search: {order_by: [:updated_at, :asc]}).search).to eq(Page.all.order(updated_at: :asc)) - expect(page_searcher.new(search: {order_by: [:updated_at, :desc]}).search).to eq(Page.all.order(updated_at: :desc)) - expect(page_searcher.new(search: {order_by: :updated_at}).search).to eq(Page.all.order(updated_at: :asc)) + expect(page_searcher.new({order_by: [:updated_at, :asc]}).search).to eq(Page.all.order(updated_at: :asc)) + expect(page_searcher.new({order_by: [:updated_at, :desc]}).search).to eq(Page.all.order(updated_at: :desc)) + expect(page_searcher.new({order_by: :updated_at}).search).to eq(Page.all.order(updated_at: :asc)) end it 'orders searches based on title' do - expect(page_searcher.new(search: {order_by: [:title, :asc]}).search).to eq(Page.all.order(title: :asc)) - expect(page_searcher.new(search: {order_by: [:title, :desc]}).search).to eq(Page.all.order(title: :desc)) - expect(page_searcher.new(search: {order_by: :title}).search).to eq(Page.all.order(title: :asc)) + expect(page_searcher.new({order_by: [:title, :asc]}).search).to eq(Page.all.order(title: :asc)) + expect(page_searcher.new({order_by: [:title, :desc]}).search).to eq(Page.all.order(title: :desc)) + expect(page_searcher.new({order_by: :title}).search).to eq(Page.all.order(title: :asc)) end it 'orders searches based on featured' do - expect(page_searcher.new(search: {order_by: [:featured, :asc]}).search).to eq(Page.all.order(featured: :asc)) - expect(page_searcher.new(search: {order_by: [:featured, :desc]}).search).to eq(Page.all.order(featured: :desc)) - expect(page_searcher.new(search: {order_by: :featured}).search).to eq(Page.all.order(featured: :asc)) + expect(page_searcher.new({order_by: [:featured, :asc]}).search).to eq(Page.all.order(featured: :asc)) + expect(page_searcher.new({order_by: [:featured, :desc]}).search).to eq(Page.all.order(featured: :desc)) + expect(page_searcher.new({order_by: :featured}).search).to eq(Page.all.order(featured: :asc)) end - it 'orders searches based on active' do - expect(page_searcher.new(search: {order_by: [:active, :asc]}).search).to eq(Page.all.order(active: :asc)) - expect(page_searcher.new(search: {order_by: [:active, :desc]}).search).to eq(Page.all.order(active: :desc)) - expect(page_searcher.new(search: {order_by: :active}).search).to eq(Page.all.order(active: :asc)) + it 'orders searches based on publish_status' do + expect(page_searcher.new({order_by: [:publish_status, :asc]}).search).to eq(Page.all.order(publish_status: :asc)) + expect(page_searcher.new({order_by: [:publish_status, :desc]}).search).to eq(Page.all.order(publish_status: :desc)) + expect(page_searcher.new({order_by: :publish_status}).search).to eq(Page.all.order(publish_status: :asc)) end it 'ignores invalid order_by_queries' do - expect(page_searcher.new(search: {order_by: [:actions, :asc]}).search).to eq(Page.all) - expect(page_searcher.new(search: {order_by: :actions}).search).to eq(Page.all) + expect(page_searcher.new({order_by: [:actions, :asc]}).search).to eq(Page.all) + expect(page_searcher.new({order_by: :actions}).search).to eq(Page.all) end end end diff --git a/spec/services/search/page_searcher/single_criterion_search/search_by_campaign_spec.rb b/spec/services/search/page_searcher/single_criterion_search/search_by_campaign_spec.rb index fc31b0a33..a3050cb50 100644 --- a/spec/services/search/page_searcher/single_criterion_search/search_by_campaign_spec.rb +++ b/spec/services/search/page_searcher/single_criterion_search/search_by_campaign_spec.rb @@ -6,7 +6,7 @@ context 'searches by single criterion,' do context 'by campaign' do include_context 'page_searcher_spec_data' - let(:search_by_campaign) { Search::PageSearcher.new({search: {campaign: [campaign.id]} }) } + let(:search_by_campaign) { Search::PageSearcher.new(campaign: [campaign.id]) } let!(:unused_campaign) { create(:campaign, name:'unused campaign') } it 'searches for a page based on the campaign it belongs to' do expect(search_by_campaign.search).to match_array([title_language_campaign_match]) @@ -14,46 +14,46 @@ describe 'returns all pages when searching' do it 'with an empty array' do - expect(Search::PageSearcher.new({search: {campaign: []} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new(campaign: []).search).to match_array(Page.all) end it 'with nil' do - expect(Search::PageSearcher.new({search: {campaign: nil} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new(campaign: nil).search).to match_array(Page.all) end it 'with an empty string' do - expect(Search::PageSearcher.new({search: {campaign: ''} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new(campaign: '').search).to match_array(Page.all) end end describe 'returns no pages when searching' do it 'with a non-existent campaign id' do - expect(Search::PageSearcher.new({search: {campaign: [Page.last.id+1]} }).search).to match_array([]) + expect(Search::PageSearcher.new(campaign: [Page.last.id+1]).search).to match_array([]) end it 'with an unused campaign id' do - expect(Search::PageSearcher.new({search: {campaign: [unused_campaign.id]} }).search).to match_array([]) + expect(Search::PageSearcher.new(campaign: [unused_campaign.id]).search).to match_array([]) end end describe 'returns one page when searching' do it 'with a campaign that only contains one page' do - expect(Search::PageSearcher.new({search: {campaign: [unimpactful_campaign.id]} }).search).to match_array([single_return_page]) + expect(Search::PageSearcher.new(campaign: [unimpactful_campaign.id]).search).to match_array([single_return_page]) end end describe 'returns some pages when searching' do it 'with a used campaign id and an unused campaign id' do - expect(Search::PageSearcher.new({search: {campaign: [unimpactful_campaign.id, unused_campaign.id]} }).search).to match_array([single_return_page]) + expect(Search::PageSearcher.new(campaign: [unimpactful_campaign.id, unused_campaign.id]).search).to match_array([single_return_page]) end end describe 'returns multiple pages when searching' do it 'with mutiple campaign ids that different pages belong to' do - expect(Search::PageSearcher.new({search: {campaign: [unimpactful_campaign.id, twin_campaign.id]} }).search).to match_array([ + expect(Search::PageSearcher.new(campaign: [unimpactful_campaign.id, twin_campaign.id]).search).to match_array([ twin_page_1, twin_page_2, single_return_page ]) end it 'with a campaign id that several pages belong to' do - expect(Search::PageSearcher.new({search: {campaign: [twin_campaign.id]} }).search).to match_array([twin_page_1, twin_page_2]) + expect(Search::PageSearcher.new(campaign: [twin_campaign.id]).search).to match_array([twin_page_1, twin_page_2]) end end diff --git a/spec/services/search/page_searcher/single_criterion_search/search_by_language_spec.rb b/spec/services/search/page_searcher/single_criterion_search/search_by_language_spec.rb index 60c646787..6123dfb5d 100644 --- a/spec/services/search/page_searcher/single_criterion_search/search_by_language_spec.rb +++ b/spec/services/search/page_searcher/single_criterion_search/search_by_language_spec.rb @@ -6,52 +6,52 @@ context 'searches by single criterion,' do context 'by language' do include_context 'page_searcher_spec_data' - let(:language_searcher) { Search::PageSearcher.new({search: {language: [language.id]} }) } + let(:language_searcher) { Search::PageSearcher.new({language: [language.id]}) } it 'finds only the page that corresponds to the specified language' do expect(language_searcher.search).to match_array([title_language_campaign_match]) end describe 'returns all pages unfiltered when searching' do describe 'returns all pages when searching' do it 'with an empty array' do - expect(Search::PageSearcher.new({search: {language: []} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new({language: []}).search).to match_array(Page.all) end it 'with nil' do - expect(Search::PageSearcher.new({search: {language: nil} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new({language: nil}).search).to match_array(Page.all) end it 'with an empty string' do - expect(Search::PageSearcher.new({search: {language: ''} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new({language: ''}).search).to match_array(Page.all) end end end describe 'returns no pages when searching' do it 'with a non-existent language' do - expect(Search::PageSearcher.new({search: {language: [Language.last.id+999]} }).search).to match_array([]) + expect(Search::PageSearcher.new({language: [Language.last.id+999]}).search).to match_array([]) end it 'with an unused language' do - expect(Search::PageSearcher.new({search: {language: [unused_language.id]} }).search).to match_array([]) + expect(Search::PageSearcher.new({language: [unused_language.id]}).search).to match_array([]) end end describe 'returns one page when searching' do it 'with a language that only one page belongs to' do - expect(Search::PageSearcher.new({search: {language: [pig_latin.id]} }).search).to match_array([single_return_page]) + expect(Search::PageSearcher.new({language: [pig_latin.id]}).search).to match_array([single_return_page]) end end describe 'returns some pages when searching' do it 'with a used language and an unused language' do - expect(Search::PageSearcher.new({search: {language: [pig_latin.id, unused_language.id]}}).search).to match_array([single_return_page]) + expect(Search::PageSearcher.new({language: [pig_latin.id, unused_language.id]}).search).to match_array([single_return_page]) end end describe 'returns multiple pages when searching' do it 'with mutiple languages that different pages belong to' do - expect(Search::PageSearcher.new({search: {language: [pig_latin.id, klingon.id]}}).search).to match_array([single_return_page, twin_page_1, twin_page_2]) + expect(Search::PageSearcher.new({language: [pig_latin.id, klingon.id]}).search).to match_array([single_return_page, twin_page_1, twin_page_2]) end it 'with a language that several pages belong to' do - expect(Search::PageSearcher.new({search: {language: [klingon.id]}}).search).to match_array([twin_page_1, twin_page_2]) + expect(Search::PageSearcher.new({language: [klingon.id]}).search).to match_array([twin_page_1, twin_page_2]) end end diff --git a/spec/services/search/page_searcher/single_criterion_search/search_by_layout_spec.rb b/spec/services/search/page_searcher/single_criterion_search/search_by_layout_spec.rb index 05b2935d7..dd1edbffa 100644 --- a/spec/services/search/page_searcher/single_criterion_search/search_by_layout_spec.rb +++ b/spec/services/search/page_searcher/single_criterion_search/search_by_layout_spec.rb @@ -6,7 +6,7 @@ context 'searches by single criterion,' do context 'by layout' do include_context 'page_searcher_spec_data' - let(:layout_searcher) { Search::PageSearcher.new({search: {layout: [layout.id]} }) } + let(:layout_searcher) { Search::PageSearcher.new({layout: [layout.id]}) } it 'finds a page that contains the specified liquid layout' do expect(layout_searcher.search).to match_array([content_tag_plugin_layout_match]) @@ -15,45 +15,45 @@ describe 'returns all pages unfiltered when searching' do describe 'returns all pages when searching' do it 'with an empty array' do - expect(Search::PageSearcher.new({search: {layout: []} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new({layout: []}).search).to match_array(Page.all) end it 'with nil' do - expect(Search::PageSearcher.new({search: {layout: nil} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new({layout: nil}).search).to match_array(Page.all) end it 'with an empty string' do - expect(Search::PageSearcher.new({search: {layout: ''} }).search).to match_array(Page.all) + expect(Search::PageSearcher.new({layout: ''}).search).to match_array(Page.all) end end end describe 'returns no pages when searching' do it 'with a non-existent layout' do - expect(Search::PageSearcher.new({search: {layout: [LiquidLayout.last.id+1]} }).search).to match_array([]) + expect(Search::PageSearcher.new({layout: [LiquidLayout.last.id+1]}).search).to match_array([]) end it 'with an unused layout' do - expect(Search::PageSearcher.new({search: {layout: [unused_layout.id]} }).search).to match_array([]) + expect(Search::PageSearcher.new({layout: [unused_layout.id]}).search).to match_array([]) end end describe 'returns one page when searching' do it 'with a layout that only one page belongs to' do - expect(Search::PageSearcher.new({search: {layout: [messy_layout.id]} }).search).to match_array([single_return_page]) + expect(Search::PageSearcher.new({layout: [messy_layout.id]}).search).to match_array([single_return_page]) end end describe 'returns some pages when searching' do it 'with a used layout and an unused layout' do - expect(Search::PageSearcher.new({search: {layout: [messy_layout.id, unused_layout.id]}}).search).to match_array([single_return_page]) + expect(Search::PageSearcher.new({layout: [messy_layout.id, unused_layout.id]}).search).to match_array([single_return_page]) end end describe 'returns multiple pages when searching' do it 'with mutiple layouts that different pages belong to' do - expect(Search::PageSearcher.new({search: {layout: [messy_layout.id, twin_layout.id]}}).search).to match_array([single_return_page, twin_page_1, twin_page_2]) + expect(Search::PageSearcher.new({layout: [messy_layout.id, twin_layout.id]}).search).to match_array([single_return_page, twin_page_1, twin_page_2]) end it 'with a layout that several pages belong to' do - expect(Search::PageSearcher.new({search: {layout: [twin_layout.id]}}).search).to match_array([twin_page_1, twin_page_2]) + expect(Search::PageSearcher.new({layout: [twin_layout.id]}).search).to match_array([twin_page_1, twin_page_2]) end end end diff --git a/spec/services/search/page_searcher/single_criterion_search/search_by_plugin_spec.rb b/spec/services/search/page_searcher/single_criterion_search/search_by_plugin_spec.rb index 8351df654..88df258d9 100644 --- a/spec/services/search/page_searcher/single_criterion_search/search_by_plugin_spec.rb +++ b/spec/services/search/page_searcher/single_criterion_search/search_by_plugin_spec.rb @@ -24,30 +24,30 @@ describe 'returns all pages when searching' do it 'with an empty array' do - expect(Search::PageSearcher.new({search: {plugin_type: []}}).search).to match_array(Page.all) + expect(Search::PageSearcher.new(plugin_type: []).search).to match_array(Page.all) end it 'with nil' do - expect(Search::PageSearcher.new({search: {plugin_type: nil}}).search).to match_array(Page.all) + expect(Search::PageSearcher.new(plugin_type: nil).search).to match_array(Page.all) end it 'with empty string' do - expect(Search::PageSearcher.new({search: {plugin_type: ""}}).search).to match_array(Page.all) + expect(Search::PageSearcher.new(plugin_type: "").search).to match_array(Page.all) end end describe 'returns no pages when searching' do it 'with a plugin has been turned off on all of the pages' do - expect(Search::PageSearcher.new({search: {plugin_type: ['Plugins::Thermometer']}}).search).to match_array([]) + expect(Search::PageSearcher.new(plugin_type: ['Plugins::Thermometer']).search).to match_array([]) end it 'with a plugin that does not exist' do - expect(Search::PageSearcher.new({search: {plugin_type: ['Plugins::UnusedPlugin']}}).search).to match_array([]) + expect(Search::PageSearcher.new(plugin_type: ['Plugins::UnusedPlugin']).search).to match_array([]) end it 'with several plugins where a page matches one but not the rest of them' do - expect(Search::PageSearcher.new({search: {plugin_type: ['Plugins::Thermometer', 'Plugins::UnusedPlugin']}}).search).to match_array([]) + expect(Search::PageSearcher.new(plugin_type: ['Plugins::Thermometer', 'Plugins::UnusedPlugin']).search).to match_array([]) end it 'with several plugins where at least one page matches by criteria but at least one of the requested plugins is deactivated' do default_page_thermometer.update(active: false) - expect(Search::PageSearcher.new({search: {plugin_type: ['Plugins::Petition', 'Plugins::Thermometer']}}).search).to match_array([]) + expect(Search::PageSearcher.new(plugin_type: ['Plugins::Petition', 'Plugins::Thermometer']).search).to match_array([]) end end @@ -61,7 +61,7 @@ expect(default_page_thermometer.active).to eq(true) expect(thermometer_page_thermometer.active).to eq(true) expect(thermometer_page_thermometer.page).to eq(thermometer_page) - expect((Search::PageSearcher.new({search: {plugin_type: ['Plugins::Thermometer']}})).search).to match_array([default_page, thermometer_page]) + expect((Search::PageSearcher.new(plugin_type: ['Plugins::Thermometer'])).search).to match_array([default_page, thermometer_page]) end it 'with several plugins, if a page exists where all of them are active' do @@ -75,7 +75,7 @@ petition_page_thermometer.update(active: false) thermometer_page_thermometer.update(active: true) - expect(Search::PageSearcher.new({search: {plugin_type: ['Plugins::Petition', 'Plugins::Thermometer']}}).search).to match_array([default_page]) + expect(Search::PageSearcher.new(plugin_type: ['Plugins::Petition', 'Plugins::Thermometer']).search).to match_array([default_page]) end end end diff --git a/spec/services/search/page_searcher/single_criterion_search/search_by_tag_spec.rb b/spec/services/search/page_searcher/single_criterion_search/search_by_tag_spec.rb index 02323498f..64ac14476 100644 --- a/spec/services/search/page_searcher/single_criterion_search/search_by_tag_spec.rb +++ b/spec/services/search/page_searcher/single_criterion_search/search_by_tag_spec.rb @@ -27,63 +27,63 @@ tags: [tag3, tag4, tag5] ) } - let(:tag_searcher) { Search::PageSearcher.new({search: {tags: [tag.id]} }) } + let(:tag_searcher) { Search::PageSearcher.new(tags: [tag.id]) } it 'searches for a page based on the tags on that page' do expect(tag_searcher.search).to match_array([content_tag_plugin_layout_match]) end describe 'does not filter by tag when searching' do it 'with an empty tag array' do - expect((Search::PageSearcher.new({search: {tags: []}})).search).to match_array(Page.all) + expect((Search::PageSearcher.new(tags: [])).search).to match_array(Page.all) end it 'with tag array set to nil' do - expect((Search::PageSearcher.new({search: {tags: nil}})).search).to match_array(Page.all) + expect((Search::PageSearcher.new(tags: nil)).search).to match_array(Page.all) end it 'with an empty string' do - expect((Search::PageSearcher.new({search: {tags: ''}})).search).to match_array(Page.all) + expect((Search::PageSearcher.new(tags: '')).search).to match_array(Page.all) end end describe 'does not return any pages when searching' do it 'with a non-existent tag id' do - expect((Search::PageSearcher.new({search: {tags: [Tag.last.id+1]}})).search).to match_array([]) + expect((Search::PageSearcher.new(tags: [Tag.last.id+1])).search).to match_array([]) end it 'with an unused tag' do - expect((Search::PageSearcher.new({search: {tags: [unused_tag.id]}})).search).to match_array([]) + expect((Search::PageSearcher.new(tags: [unused_tag.id])).search).to match_array([]) end it 'with a used tag and an unused tag' do - expect((Search::PageSearcher.new({search: {tags: [unused_tag.id, tag.id]}})).search).to match_array([]) + expect((Search::PageSearcher.new(tags: [unused_tag.id, tag.id])).search).to match_array([]) end it 'with two used tags never used on the same page' do - expect((Search::PageSearcher.new({search: {tags: [tag.id, alternative_tag.id]}})).search).to match_array([]) + expect((Search::PageSearcher.new(tags: [tag.id, alternative_tag.id])).search).to match_array([]) end end describe 'returns one page when searching' do it "with a tag that's only assigned to that page" do - expect((Search::PageSearcher.new({search: {tags: [tag.id]}})).search).to match_array([content_tag_plugin_layout_match]) + expect((Search::PageSearcher.new(tags: [tag.id])).search).to match_array([content_tag_plugin_layout_match]) end it "with one of that page's several tags" do - expect((Search::PageSearcher.new({search: {tags: [the_best_tag.id]}})).search).to match_array([has_many_tags]) + expect((Search::PageSearcher.new(tags: [the_best_tag.id])).search).to match_array([has_many_tags]) end it "with multiple of that page's tags in any order" do - expect((Search::PageSearcher.new({search: {tags: [hipster_tag.id, unpopular_tag.id]}})).search).to match_array([single_return_page]) - expect((Search::PageSearcher.new({search: {tags: [unpopular_tag.id, hipster_tag.id]}})).search).to match_array([single_return_page]) + expect((Search::PageSearcher.new(tags: [hipster_tag.id, unpopular_tag.id])).search).to match_array([single_return_page]) + expect((Search::PageSearcher.new(tags: [unpopular_tag.id, hipster_tag.id])).search).to match_array([single_return_page]) end it "with a tag that matches two pages and a tag that matches one page" do - expect((Search::PageSearcher.new({search: {tags: [alternative_tag.id, the_best_tag.id]}})).search).to match_array([has_many_tags]) + expect((Search::PageSearcher.new(tags: [alternative_tag.id, the_best_tag.id])).search).to match_array([has_many_tags]) end end describe 'returns multiple pages when searching' do it "with a tag as the only tag of both pages" do - expect((Search::PageSearcher.new({search: {tags: [alternative_tag.id, the_best_tag.id]}})).search).to match_array([has_many_tags]) + expect((Search::PageSearcher.new(tags: [alternative_tag.id, the_best_tag.id])).search).to match_array([has_many_tags]) end it "with a tag used as one of several on both pages" do - expect((Search::PageSearcher.new({search: {tags: [tag3.id]}})).search).to match_array([intersection_page_1,intersection_page_2]) + expect((Search::PageSearcher.new(tags: [tag3.id])).search).to match_array([intersection_page_1,intersection_page_2]) end it "with multiple tags used as one of several on both pages" do - expect((Search::PageSearcher.new({search: {tags: [tag3.id, tag4.id]}})).search).to match_array([intersection_page_1,intersection_page_2]) + expect((Search::PageSearcher.new(tags: [tag3.id, tag4.id])).search).to match_array([intersection_page_1,intersection_page_2]) end end diff --git a/spec/services/search/page_searcher/single_criterion_search/search_by_text_content_spec.rb b/spec/services/search/page_searcher/single_criterion_search/search_by_text_content_spec.rb index db69b1994..938bc3351 100644 --- a/spec/services/search/page_searcher/single_criterion_search/search_by_text_content_spec.rb +++ b/spec/services/search/page_searcher/single_criterion_search/search_by_text_content_spec.rb @@ -6,7 +6,7 @@ context 'searches by single criterion,' do context 'by text content' do include_context 'page_searcher_spec_data' - let(:text_searcher) { Search::PageSearcher.new({search: {content_search: test_text} }) } + let(:text_searcher) { Search::PageSearcher.new(content_search: test_text) } it 'gets pages that match by title or by text body if the text search method is called' do expect(text_searcher.search).to match_array([content_tag_plugin_layout_match, title_language_campaign_match]) end diff --git a/spec/views/shared_examples.rb b/spec/views/shared_examples.rb index 030a0f135..5182184bd 100644 --- a/spec/views/shared_examples.rb +++ b/spec/views/shared_examples.rb @@ -58,4 +58,4 @@ end end end -end \ No newline at end of file +end