search_cop 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,67 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class FloatTest < SearchCop::TestCase
5
+ def test_anywhere
6
+ product = create(:product, :price => 10.5, :created_at => Time.now - 1.day)
7
+
8
+ assert_includes Product.search("10.5"), product
9
+ refute_includes Product.search("11.5"), product
10
+ end
11
+
12
+ def test_includes
13
+ product = create(:product, :price => 10.5)
14
+
15
+ assert_includes Product.search("price: 10.5"), product
16
+ refute_includes Product.search("price: 11.5"), product
17
+ end
18
+
19
+ def test_equals
20
+ product = create(:product, :price => 10.5)
21
+
22
+ assert_includes Product.search("price = 10.5"), product
23
+ refute_includes Product.search("price = 11.5"), product
24
+ end
25
+
26
+ def test_equals_not
27
+ product = create(:product, :price => 10.5)
28
+
29
+ assert_includes Product.search("price != 11.5"), product
30
+ refute_includes Product.search("price != 10.5"), product
31
+ end
32
+
33
+ def test_greater
34
+ product = create(:product, :price => 10.5)
35
+
36
+ assert_includes Product.search("price > 10.4"), product
37
+ refute_includes Product.search("price < 10.5"), product
38
+ end
39
+
40
+ def test_greater_equals
41
+ product = create(:product, :price => 10.5)
42
+
43
+ assert_includes Product.search("price >= 10.5"), product
44
+ refute_includes Product.search("price >= 10.6"), product
45
+ end
46
+
47
+ def test_less
48
+ product = create(:product, :price => 10.5)
49
+
50
+ assert_includes Product.search("price < 10.6"), product
51
+ refute_includes Product.search("price < 10.5"), product
52
+ end
53
+
54
+ def test_less_equals
55
+ product = create(:product, :price => 10.5)
56
+
57
+ assert_includes Product.search("price <= 10.5"), product
58
+ refute_includes Product.search("price <= 10.4"), product
59
+ end
60
+
61
+ def test_incompatible_datatype
62
+ assert_raises SearchCop::IncompatibleDatatype do
63
+ Product.unsafe_search "price: Value"
64
+ end
65
+ end
66
+ end
67
+
@@ -0,0 +1,27 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class FulltextTest < SearchCop::TestCase
5
+ def test_complex
6
+ product1 = create(:product, :title => "word1")
7
+ product2 = create(:product, :title => "word2 word3")
8
+ product3 = create(:product, :title => "word2")
9
+
10
+ results = Product.search("title:word1 OR (title:word2 -title:word3)")
11
+
12
+ assert_includes results, product1
13
+ refute_includes results, product2
14
+ assert_includes results, product3
15
+ end
16
+
17
+ def test_mixed
18
+ expected = create(:product, :title => "Expected title", :stock => 1)
19
+ rejected = create(:product, :title => "Expected title", :stock => 0)
20
+
21
+ results = Product.search("title:Expected title:Title stock > 0")
22
+
23
+ assert_includes results, expected
24
+ refute_includes results, rejected
25
+ end
26
+ end
27
+
data/test/hash_test.rb ADDED
@@ -0,0 +1,97 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class HashTest < SearchCop::TestCase
5
+ def test_subquery
6
+ product1 = create(:product, :title => "Title1", :description => "Description")
7
+ product2 = create(:product, :title => "Title2", :description => "Description")
8
+ product3 = create(:product, :title => "TItle3", :description => "Description")
9
+
10
+ results = Product.search(:or => [{ :query => "Description Title1" }, { :query => "Description Title2" }])
11
+
12
+ assert_includes results, product1
13
+ assert_includes results, product2
14
+ refute_includes results, product3
15
+ end
16
+
17
+ def test_matches
18
+ expected = create(:product, :title => "Expected")
19
+ rejected = create(:product, :title => "Rejected")
20
+
21
+ results = Product.search(:title => { :matches => "Expected" })
22
+
23
+ assert_includes results, expected
24
+ refute_includes results, rejected
25
+ end
26
+
27
+ def test_matches_default
28
+ expected = create(:product, :title => "Expected")
29
+ rejected = create(:product, :title => "Rejected")
30
+
31
+ results = Product.search(:title => "Expected")
32
+
33
+ assert_includes results, expected
34
+ refute_includes results, rejected
35
+ end
36
+
37
+ def test_eq
38
+ expected = create(:product, :title => "Expected")
39
+ rejected = create(:product, :title => "Rejected")
40
+
41
+ results = Product.search(:title => { :eq => "Expected" })
42
+
43
+ assert_includes results, expected
44
+ refute_includes results, rejected
45
+ end
46
+
47
+ def test_not_eq
48
+ expected = create(:product, :title => "Expected")
49
+ rejected = create(:product, :title => "Rejected")
50
+
51
+ results = Product.search(:title => { :not_eq => "Rejected" })
52
+
53
+ assert_includes results, expected
54
+ refute_includes results, rejected
55
+ end
56
+
57
+ def test_gt
58
+ expected = create(:product, :stock => 1)
59
+ rejected = create(:product, :stock => 0)
60
+
61
+ results = Product.search(:stock => { :gt => 0 })
62
+
63
+ assert_includes results, expected
64
+ refute_includes results, rejected
65
+ end
66
+
67
+ def test_gteq
68
+ expected = create(:product, :stock => 1)
69
+ rejected = create(:product, :stock => 0)
70
+
71
+ results = Product.search(:stock => { :gteq => 1 })
72
+
73
+ assert_includes results, expected
74
+ refute_includes results, rejected
75
+ end
76
+
77
+ def test_lt
78
+ expected = create(:product, :stock => 0)
79
+ rejected = create(:product, :stock => 1)
80
+
81
+ results = Product.search(:stock => { :lt => 1 })
82
+
83
+ assert_includes results, expected
84
+ refute_includes results, rejected
85
+ end
86
+
87
+ def test_lteq
88
+ expected = create(:product, :stock => 0)
89
+ rejected = create(:product, :stock => 1)
90
+
91
+ results = Product.search(:stock => { :lteq => 0 })
92
+
93
+ assert_includes results, expected
94
+ refute_includes results, rejected
95
+ end
96
+ end
97
+
@@ -0,0 +1,67 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class IntegerTest < SearchCop::TestCase
5
+ def test_anywhere
6
+ product = create(:product, :stock => 1)
7
+
8
+ assert_includes Product.search("1"), product
9
+ refute_includes Product.search("0"), product
10
+ end
11
+
12
+ def test_includes
13
+ product = create(:product, :stock => 1)
14
+
15
+ assert_includes Product.search("stock: 1"), product
16
+ refute_includes Product.search("stock: 10"), product
17
+ end
18
+
19
+ def test_equals
20
+ product = create(:product, :stock => 1)
21
+
22
+ assert_includes Product.search("stock = 1"), product
23
+ refute_includes Product.search("stock = 0"), product
24
+ end
25
+
26
+ def test_equals_not
27
+ product = create(:product, :stock => 1)
28
+
29
+ assert_includes Product.search("stock != 0"), product
30
+ refute_includes Product.search("stock != 1"), product
31
+ end
32
+
33
+ def test_greater
34
+ product = create(:product, :stock => 1)
35
+
36
+ assert_includes Product.search("stock > 0"), product
37
+ refute_includes Product.search("stock < 1"), product
38
+ end
39
+
40
+ def test_greater_equals
41
+ product = create(:product, :stock => 1)
42
+
43
+ assert_includes Product.search("stock >= 1"), product
44
+ refute_includes Product.search("stock >= 2"), product
45
+ end
46
+
47
+ def test_less
48
+ product = create(:product, :stock => 1)
49
+
50
+ assert_includes Product.search("stock < 2"), product
51
+ refute_includes Product.search("stock < 1"), product
52
+ end
53
+
54
+ def test_less_equals
55
+ product = create(:product, :stock => 1)
56
+
57
+ assert_includes Product.search("stock <= 1"), product
58
+ refute_includes Product.search("stock <= 0"), product
59
+ end
60
+
61
+ def test_incompatible_datatype
62
+ assert_raises SearchCop::IncompatibleDatatype do
63
+ Product.unsafe_search "stock: Value"
64
+ end
65
+ end
66
+ end
67
+
data/test/not_test.rb ADDED
@@ -0,0 +1,27 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class NotTest < SearchCop::TestCase
5
+ def test_not_string
6
+ expected = create(:product, :title => "Expected title")
7
+ rejected = create(:product, :title => "Rejected title")
8
+
9
+ results = Product.search("title: Title NOT title: Rejected")
10
+
11
+ assert_includes results, expected
12
+ refute_includes results, rejected
13
+
14
+ assert_equal results, Product.search("title: Title -title: Rejected")
15
+ end
16
+
17
+ def test_not_hash
18
+ expected = create(:product, :title => "Expected title")
19
+ rejected = create(:product, :title => "Rejected title")
20
+
21
+ results = Product.search(:and => [{:title => "Title"}, {:not => {:title => "Rejected"}}])
22
+
23
+ assert_includes results, expected
24
+ refute_includes results, rejected
25
+ end
26
+ end
27
+
data/test/or_test.rb ADDED
@@ -0,0 +1,29 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class OrTest < SearchCop::TestCase
5
+ def test_or_string
6
+ product1 = create(:product, :title => "Title1")
7
+ product2 = create(:product, :title => "Title2")
8
+ product3 = create(:product, :title => "Title3")
9
+
10
+ results = Product.search("title: Title1 OR title: Title2")
11
+
12
+ assert_includes results, product1
13
+ assert_includes results, product2
14
+ refute_includes results, product3
15
+ end
16
+
17
+ def test_or_hash
18
+ product1 = create(:product, :title => "Title1")
19
+ product2 = create(:product, :title => "Title2")
20
+ product3 = create(:product, :title => "Title3")
21
+
22
+ results = Product.search(:or => [{:title => "Title1"}, {:title => "Title2"}])
23
+
24
+ assert_includes results, product1
25
+ assert_includes results, product2
26
+ refute_includes results, product3
27
+ end
28
+ end
29
+
@@ -0,0 +1,35 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class ScopeTest < SearchCop::TestCase
5
+ def test_user_search
6
+ expected = create(:product, :title => "Expected")
7
+ rejected = create(:product, :notice => "Expected")
8
+
9
+ results = Product.user_search("Expected")
10
+
11
+ assert_includes results, expected
12
+ refute_includes results, rejected
13
+ end
14
+
15
+ def test_options
16
+ expected = create(:product, :title => "Expected")
17
+ rejected = create(:product, :description => "Expected")
18
+
19
+ results = Product.user_search("Expected")
20
+
21
+ assert_includes results, expected
22
+ refute_includes results, rejected
23
+ end
24
+
25
+ def test_aliases
26
+ expected = create(:product, :comments => [create(:comment, :user => create(:user, :username => "Expected"))])
27
+ rejected = create(:product, :comments => [create(:comment, :user => create(:user, :username => "Rejected"))])
28
+
29
+ results = Product.search("user: Expected")
30
+
31
+ assert_includes results, expected
32
+ refute_includes results, rejected
33
+ end
34
+ end
35
+
@@ -0,0 +1,131 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class SearchCopTest < SearchCop::TestCase
5
+ def test_scope_before
6
+ expected = create(:product, :stock => 1, :title => "Title")
7
+ rejected = create(:product, :stock => 0, :title => "Title")
8
+
9
+ results = Product.where(:stock => 1).search("Title")
10
+
11
+ assert_includes results, expected
12
+ refute_includes results, rejected
13
+ end
14
+
15
+ def test_scope_after
16
+ expected = create(:product, :stock => 1, :title => "Title")
17
+ rejected = create(:product, :stock => 0, :title => "Title")
18
+
19
+ results = Product.search("Title").where(:stock => 1)
20
+
21
+ assert_includes results, expected
22
+ refute_includes results, rejected
23
+ end
24
+
25
+ def test_scope
26
+ expected = create(:product, :stock => 1, :title => "Title")
27
+ rejected = create(:product, :stock => 0, :title => "Title")
28
+
29
+ results = with_scope(Product.search_scopes[:search], lambda { where :stock => 1 }) { Product.search("title: Title") }
30
+
31
+ assert_includes results, expected
32
+ refute_includes results, rejected
33
+ end
34
+
35
+ def test_multi_associations
36
+ product = create(:product, :comments => [
37
+ create(:comment, :title => "Title1", :message => "Message1"),
38
+ create(:comment, :title => "Title2", :message => "Message2")
39
+ ])
40
+
41
+ assert_includes Product.search("comment: Title1 comment: Message1"), product
42
+ assert_includes Product.search("comment: Title2 comment: Message2"), product
43
+ end
44
+
45
+ def test_single_association
46
+ expected = create(:comment, :user => create(:user, :username => "Expected"))
47
+ rejected = create(:comment, :user => create(:user, :username => "Rejected"))
48
+
49
+ results = Comment.search("user: Expected")
50
+
51
+ assert_includes results, expected
52
+ refute_includes results, rejected
53
+ end
54
+
55
+ def test_deep_associations
56
+ expected = create(:product, :comments => [create(:comment, :user => create(:user, :username => "Expected"))])
57
+ rejected = create(:product, :comments => [create(:comment, :user => create(:user, :username => "Rejected"))])
58
+
59
+ results = Product.search("user: Expected")
60
+
61
+ assert_includes results, expected
62
+ refute_includes results, rejected
63
+ end
64
+
65
+ def test_multiple
66
+ product = create(:product, :comments => [create(:comment, :title => "Title", :message => "Message")])
67
+
68
+ assert_includes Product.search("comment: Title"), product
69
+ assert_includes Product.search("comment: Message"), product
70
+ end
71
+
72
+ def test_default
73
+ product1 = create(:product, :title => "Expected")
74
+ product2 = create(:product, :description => "Expected")
75
+
76
+ results = Product.search("Expected")
77
+
78
+ assert_includes results, product1
79
+ assert_includes results, product2
80
+ end
81
+
82
+ def test_custom_default_enabled
83
+ product1 = create(:product, :title => "Expected")
84
+ product2 = create(:product, :description => "Expected")
85
+ product3 = create(:product, :brand => "Expected")
86
+
87
+ results = with_options(Product.search_scopes[:search], :primary, :default => true) { Product.search "Expected" }
88
+
89
+ assert_includes results, product1
90
+ assert_includes results, product2
91
+ refute_includes results, product3
92
+ end
93
+
94
+ def test_custom_default_disabled
95
+ product1 = create(:product, :brand => "Expected")
96
+ product2 = create(:product, :notice => "Expected")
97
+
98
+ results = with_options(Product.search_scopes[:search], :notice, :default => false) { Product.search "Expected" }
99
+
100
+ assert_includes results, product1
101
+ refute_includes results, product2
102
+ end
103
+
104
+ def test_count
105
+ create_list :product, 2, :title => "Expected"
106
+
107
+ assert_equal 2, Product.search("Expected").count
108
+ end
109
+
110
+ def test_default_attributes_true
111
+ with_options(Product.search_scopes[:search], :title, :default => true) do
112
+ with_options(Product.search_scopes[:search], :description, :default => true) do
113
+ assert_equal ["title", "description"], Product.search_scopes[:search].reflection.default_attributes.keys
114
+ end
115
+ end
116
+ end
117
+
118
+ def test_default_attributes_fales
119
+ with_options(Product.search_scopes[:search], :title, :default => false) do
120
+ with_options(Product.search_scopes[:search], :description, :default => false) do
121
+ assert_equal Product.search_scopes[:search].reflection.attributes.keys - ["title", "description"], Product.search_scopes[:search].reflection.default_attributes.keys
122
+ end
123
+ end
124
+ end
125
+
126
+ def test_search_reflection
127
+ assert_not_nil Product.search_reflection(:search)
128
+ assert_not_nil Product.search_reflection(:user_search)
129
+ end
130
+ end
131
+
@@ -0,0 +1,84 @@
1
+
2
+ require File.expand_path("../test_helper", __FILE__)
3
+
4
+ class StringTest < SearchCop::TestCase
5
+ def test_anywhere
6
+ product = create(:product, :title => "Expected title")
7
+
8
+ assert_includes Product.search("Expected"), product
9
+ refute_includes Product.search("Rejected"), product
10
+ end
11
+
12
+ def test_multiple
13
+ product = create(:product, :comments => [create(:comment, :title => "Expected title", :message => "Expected message")])
14
+
15
+ assert_includes Product.search("Expected"), product
16
+ refute_includes Product.search("Rejected"), product
17
+ end
18
+
19
+ def test_includes
20
+ product = create(:product, :title => "Expected")
21
+
22
+ assert_includes Product.search("title: Expected"), product
23
+ refute_includes Product.search("title: Rejected"), product
24
+ end
25
+
26
+ def test_includes_with_left_wildcard
27
+ product = create(:product, :title => "Some title")
28
+
29
+ assert_includes Product.search("title: Title"), product
30
+ end
31
+
32
+ def test_includes_without_left_wildcard
33
+ expected = create(:product, :brand => "Brand")
34
+ rejected = create(:product, :brand => "Rejected brand")
35
+
36
+ results = with_options(Product.search_scopes[:search], :brand, :left_wildcard => false) { Product.search "brand: Brand" }
37
+
38
+ assert_includes results, expected
39
+ refute_includes results, rejected
40
+ end
41
+
42
+ def test_equals
43
+ product = create(:product, :title => "Expected title")
44
+
45
+ assert_includes Product.search("title = 'Expected title'"), product
46
+ refute_includes Product.search("title = Expected"), product
47
+ end
48
+
49
+ def test_equals_not
50
+ product = create(:product, :title => "Expected")
51
+
52
+ assert_includes Product.search("title != Rejected"), product
53
+ refute_includes Product.search("title != Expected"), product
54
+ end
55
+
56
+ def test_greater
57
+ product = create(:product, :title => "Title B")
58
+
59
+ assert_includes Product.search("title > 'Title A'"), product
60
+ refute_includes Product.search("title > 'Title B'"), product
61
+ end
62
+
63
+ def test_greater_equals
64
+ product = create(:product, :title => "Title A")
65
+
66
+ assert_includes Product.search("title >= 'Title A'"), product
67
+ refute_includes Product.search("title >= 'Title B'"), product
68
+ end
69
+
70
+ def test_less
71
+ product = create(:product, :title => "Title A")
72
+
73
+ assert_includes Product.search("title < 'Title B'"), product
74
+ refute_includes Product.search("title < 'Title A'"), product
75
+ end
76
+
77
+ def test_less_or_greater
78
+ product = create(:product, :title => "Title B")
79
+
80
+ assert_includes Product.search("title <= 'Title B'"), product
81
+ refute_includes Product.search("title <= 'Title A'"), product
82
+ end
83
+ end
84
+