Skip to content

Commit

Permalink
fix: filter tests (#187)
Browse files Browse the repository at this point in the history
  • Loading branch information
mihaimdm22 committed Nov 30, 2020
1 parent b71062b commit 2cb6abd
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 107 deletions.
4 changes: 2 additions & 2 deletions app/controllers/avo/resources_controller.rb
Expand Up @@ -224,8 +224,8 @@ def applied_filters
avo_resource.get_filters.each do |filter_class|
filter = filter_class.new

if filter.default_value.present?
filter_defaults[filter_class.to_s] = filter.default_value
if filter.default.present?
filter_defaults[filter_class.to_s] = filter.default
end
end

Expand Down
13 changes: 1 addition & 12 deletions lib/avo/app/filter.rb
Expand Up @@ -4,8 +4,6 @@ class Filter
attr_accessor :component
attr_accessor :default

@@default = nil

def initialize
@name ||= 'Filter'
@component ||= 'boolean-filter'
Expand All @@ -18,7 +16,7 @@ def render_response
name: name,
options: options,
component: component,
default: default_value,
default: default,
filter_class: self.class.to_s,
}
end
Expand All @@ -32,14 +30,5 @@ def apply_query(request, query, value)
def id
self.class.name.underscore.gsub('/', '_')
end

# These methods helps us set a default value in the testing environment
def default_value
@@default || default
end

def self.set_default(value)
@@default = value
end
end
end
27 changes: 27 additions & 0 deletions spec/dummy/app/avo/filters/members_filter.rb
@@ -0,0 +1,27 @@
module Avo
module Filters
class MembersFilter < BooleanFilter
def name
'Members filter'
end

def apply(request, query, value)
return query.where(id: Team.joins(:memberships).group('teams.id').count.keys) if value[:has_members]

query
end

def default
{
has_members: true
}
end

def options
{
'has_members': 'Has Members'
}
end
end
end
end
2 changes: 2 additions & 0 deletions spec/dummy/app/avo/resources/team.rb
Expand Up @@ -18,6 +18,8 @@ def initialize
has_one :admin
has_many :members
end

use_filter Avo::Filters::MembersFilter
end
end
end
238 changes: 146 additions & 92 deletions spec/system/avo/filters_spec.rb
@@ -1,10 +1,10 @@
require 'rails_helper'

RSpec.describe 'Filters', type: :system do
let!(:featured_post) { create :post, name: 'Featured post', is_featured: true }
let!(:unfeatured_post) { create :post, name: 'Unfeatured post', is_featured: false }
describe 'Boolean filter without default' do
let!(:featured_post) { create :post, name: 'Featured post', is_featured: true }
let!(:unfeatured_post) { create :post, name: 'Unfeatured post', is_featured: false }

describe 'Boolean filter' do
let(:url) { '/avo/resources/posts' }

it 'displays the filter' do
Expand All @@ -16,6 +16,7 @@
expect(page).to have_unchecked_field 'Unfeatured'
expect(page).to have_text 'Featured post'
expect(page).to have_text 'Unfeatured post'
expect(page).to have_button('Reset filters', disabled: true)
end

it 'changes the query' do
Expand All @@ -30,9 +31,10 @@
expect(page).to have_checked_field 'Featured'
expect(page).to have_unchecked_field 'Unfeatured'
expect(current_url).to include 'filters='
expect(page).to have_button('Reset filters', disabled: false)
end

it 'changes the query back' do
it 'changes the query back also with reset' do
visit url
find('[data-button="resource-filters"]').click

Expand All @@ -42,6 +44,7 @@
expect(page).to have_text 'Featured post'
expect(page).not_to have_text 'Unfeatured post'
expect(current_url).to include 'filters='
expect(page).to have_button('Reset filters', disabled: false)

uncheck 'Featured'
wait_for_loaded
Expand All @@ -50,6 +53,7 @@
expect(page).to have_text 'Unfeatured post'
expect(page).to have_unchecked_field 'Featured'
expect(page).to have_unchecked_field 'Unfeatured'
expect(page).to have_button('Reset filters', disabled: false)

check 'Featured'
check 'Unfeatured'
Expand All @@ -58,95 +62,145 @@
expect(page).to have_text 'Unfeatured post'
expect(page).to have_checked_field 'Featured'
expect(page).to have_checked_field 'Unfeatured'
expect(page).to have_button('Reset filters', disabled: false)

click_on 'Reset filters'
wait_for_loaded

find('[data-button="resource-filters"]').click

expect(page).to have_text 'Featured post'
expect(page).to have_text 'Unfeatured post'
expect(page).to have_unchecked_field 'Featured'
expect(page).to have_unchecked_field 'Unfeatured'
expect(current_url).not_to include 'filters='
expect(page).to have_button('Reset filters', disabled: true)
end
end

describe 'Boolean filter with default' do
let!(:user) { create :user }

let!(:team_without_members) { create :team, name: 'Without Members' }
let!(:team_with_members) { create :team, name: 'With Members' }

before do
team_with_members.members << user
end

let(:url) { '/avo/resources/teams' }

it 'displays the filter' do
visit url
find('[data-button="resource-filters"]').click

expect(page).to have_text 'Members filter'
expect(page).to have_checked_field 'Has Members'
expect(page).not_to have_text 'Without Members'
expect(page).to have_text 'With Members'
expect(page).to have_button('Reset filters', disabled: true)
end

it 'changes the query and reset' do
visit url
find('[data-button="resource-filters"]').click

uncheck 'Has Members'
wait_for_loaded

expect(page).to have_text 'Members filter'
expect(page).to have_unchecked_field 'Has Members'
expect(page).to have_text 'Without Members'
expect(page).to have_text 'With Members'
expect(page).to have_button('Reset filters', disabled: false)

click_on 'Reset filters'
wait_for_loaded

find('[data-button="resource-filters"]').click

expect(page).to have_text 'Members filter'
expect(page).to have_checked_field 'Has Members'
expect(page).not_to have_text 'Without Members'
expect(page).to have_text 'With Members'
expect(page).to have_button('Reset filters', disabled: true)
end
end

# describe 'Boolean filter' do
# let!(:available_user) { create :user, name: 'Available user', availability: true }
# let!(:unavailable_user) { create :user, name: 'Unavailable user', availability: false }

# let(:url) { '/avo/resources/users' }

# context 'without default value' do
# it 'displays the filter' do
# visit url
# find('[data-button="resource-filters"]').click

# expect(page).to have_text 'Availability filter'
# expect(page).to have_text 'Available user'
# expect(page).to have_text 'Unavailable user'
# expect(page).to have_select 'avo_filters_availability_filter', selected: empty_dash, options: [empty_dash, 'Available', 'Unavailable']
# end

# it 'changes the filter' do
# visit url
# find('[data-button="resource-filters"]').click

# select 'Unavailable', from: 'avo_filters_availability_filter'
# wait_for_loaded

# expect(page).to have_text 'Availability filter'
# expect(page).not_to have_text 'Available user'
# expect(page).to have_text 'Unavailable user'
# expect(page).to have_select 'avo_filters_availability_filter', selected: 'Unavailable', options: [empty_dash, 'Available', 'Unavailable']
# expect(current_url).to include 'filters='
# end

# it 'keeps the filter on page refresh' do
# visit url
# find('[data-button="resource-filters"]').click

# select 'Unavailable', from: 'avo_filters_availability_filter'
# wait_for_loaded

# expect(page).to have_text 'Availability filter'
# expect(page).not_to have_text 'Available user'
# expect(page).to have_text 'Unavailable user'
# expect(page).to have_select 'avo_filters_availability_filter', selected: 'Unavailable', options: [empty_dash, 'Available', 'Unavailable']
# expect(current_url).to include 'filters='

# visit current_url
# find('[data-button="resource-filters"]').click

# expect(page).to have_text 'Availability filter'
# expect(page).not_to have_text 'Available user'
# expect(page).to have_text 'Unavailable user'
# expect(page).to have_select 'avo_filters_availability_filter', selected: 'Unavailable', options: [empty_dash, 'Available', 'Unavailable']
# end
# end

# context 'with default to available' do
# before do
# Avo::Filters::AvailabilityFilter.set_default 'available'
# end

# after do
# Avo::Filters::AvailabilityFilter.set_default ''
# end

# it 'displays the filter' do
# visit url
# find('[data-button="resource-filters"]').click

# expect(page).to have_text 'Availability filter'
# expect(page).to have_text 'Available user'
# expect(page).not_to have_text 'Unavailable user'
# expect(page).to have_select 'avo_filters_availability_filter', selected: 'Available', options: [empty_dash, 'Available', 'Unavailable']
# end

# it 'changes the filter' do
# visit url
# find('[data-button="resource-filters"]').click

# select 'Unavailable', from: 'avo_filters_availability_filter'
# wait_for_loaded

# expect(page).to have_text 'Availability filter'
# expect(page).not_to have_text 'Available user'
# expect(page).to have_text 'Unavailable user'
# expect(page).to have_select 'avo_filters_availability_filter', selected: 'Unavailable', options: [empty_dash, 'Available', 'Unavailable']
# expect(current_url).to include 'filters='
# end
# end
# end
describe 'Select filter' do
let!(:published_post) { create :post, name: 'Published post', published_at: '2019-12-05 08:27:19.295065' }
let!(:unpublished_post) { create :post, name: 'Unpublished post', published_at: nil }

let(:url) { '/avo/resources/posts' }

context 'without default value' do
it 'displays the filter' do
visit url
find('[data-button="resource-filters"]').click

expect(page).to have_text 'Published status'
expect(page).to have_select 'avo_filters_published_filter', selected: empty_dash, options: [empty_dash, 'Published', 'Unpublished']
expect(page).to have_text 'Published post'
expect(page).to have_text 'Unpublished post'
expect(page).to have_button('Reset filters', disabled: true)
end

it 'changes the query' do
visit url
find('[data-button="resource-filters"]').click

select 'Published', from: 'avo_filters_published_filter'
wait_for_loaded

expect(page).to have_text 'Published post'
expect(page).not_to have_text 'Unpublished post'
expect(page).to have_select 'avo_filters_published_filter', selected: 'Published', options: [empty_dash, 'Published', 'Unpublished']
expect(current_url).to include 'filters='
expect(page).to have_button('Reset filters', disabled: false)
end

it 'changes the query back also with reset' do
visit url
find('[data-button="resource-filters"]').click

select 'Published', from: 'avo_filters_published_filter'
wait_for_loaded

expect(page).to have_text 'Published post'
expect(page).not_to have_text 'Unpublished post'
expect(page).to have_select 'avo_filters_published_filter', selected: 'Published', options: [empty_dash, 'Published', 'Unpublished']
expect(current_url).to include 'filters='
expect(page).to have_button('Reset filters', disabled: false)

select empty_dash, from: 'avo_filters_published_filter'
wait_for_loaded

expect(page).to have_text 'Published post'
expect(page).to have_text 'Unpublished post'
expect(page).to have_select 'avo_filters_published_filter', selected: empty_dash, options: [empty_dash, 'Published', 'Unpublished']
expect(current_url).not_to include 'filters='
expect(page).to have_button('Reset filters', disabled: true)

select 'Unpublished', from: 'avo_filters_published_filter'
wait_for_loaded

expect(page).not_to have_text 'Published post'
expect(page).to have_text 'Unpublished post'
expect(page).to have_select 'avo_filters_published_filter', selected: 'Unpublished', options: [empty_dash, 'Published', 'Unpublished']
expect(current_url).to include 'filters='
expect(page).to have_button('Reset filters', disabled: false)

click_on 'Reset filters'
wait_for_loaded

find('[data-button="resource-filters"]').click

expect(page).to have_text 'Published status'
expect(page).to have_select 'avo_filters_published_filter', selected: empty_dash, options: [empty_dash, 'Published', 'Unpublished']
expect(page).to have_text 'Published post'
expect(page).to have_text 'Unpublished post'
expect(page).to have_button('Reset filters', disabled: true)
end
end
end
end
11 changes: 10 additions & 1 deletion spec/system/avo/has_one_field_spec.rb
Expand Up @@ -17,7 +17,16 @@
describe 'without a related user' do
let!(:team) { create :team }

it { is_expected.to have_text empty_dash }
it 'looks for team without related user' do
visit url
find('[data-button="resource-filters"]').click

uncheck 'Has Members'
wait_for_loaded

expect(page).to have_text empty_dash

end
end
end

Expand Down

0 comments on commit 2cb6abd

Please sign in to comment.