searchgasm 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,149 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSearchgasmCondition < Test::Unit::TestCase
4
+ fixtures :accounts, :users, :orders
5
+
6
+ def setup
7
+ setup_db
8
+ load_fixtures
9
+ end
10
+
11
+ def teardown
12
+ teardown_db
13
+ end
14
+
15
+ def test_generate_name
16
+ name = BinaryLogic::Searchgasm::Search::Condition.generate_name(Account.columns_hash["id"], :equals)
17
+ assert_equal name, "id_equals"
18
+
19
+ name = BinaryLogic::Searchgasm::Search::Condition.generate_name("test", :equals)
20
+ assert_equal name, "test_equals"
21
+
22
+ name = BinaryLogic::Searchgasm::Search::Condition.generate_name("test", "")
23
+ assert_equal name, "test"
24
+
25
+ name = BinaryLogic::Searchgasm::Search::Condition.generate_name("test", nil)
26
+ assert_equal name, "test"
27
+ end
28
+
29
+ def test_initialize
30
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
31
+ assert_equal condition.condition, :equals
32
+ assert_equal condition.name, "id_equals"
33
+ assert_equal condition.klass, Account
34
+ assert_equal condition.column, Account.columns_hash["id"]
35
+
36
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, "id")
37
+ assert_equal condition.column, Account.columns_hash["id"]
38
+ end
39
+
40
+ def test_explicitly_set_value
41
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
42
+ assert !condition.explicitly_set_value?
43
+ condition.value = nil
44
+ assert condition.explicitly_set_value?
45
+ end
46
+
47
+ def test_ignore_blanks?
48
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
49
+ assert !condition.ignore_blanks?
50
+
51
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:greater_than, Account, Account.columns_hash["id"])
52
+ assert condition.ignore_blanks?
53
+
54
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:contains, Account, Account.columns_hash["name"])
55
+ assert condition.ignore_blanks?
56
+ end
57
+
58
+ def test_sanitize
59
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
60
+ condition.value = 12
61
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" = 12"]
62
+
63
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
64
+ condition.value = nil
65
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" IS NULL"]
66
+
67
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
68
+ condition.value = (1..100)
69
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" BETWEEN 1 AND 100"]
70
+
71
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:equals, Account, Account.columns_hash["id"])
72
+ condition.value = [1,2,3,4,5]
73
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" IN (1,2,3,4,5)"]
74
+
75
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
76
+ condition.value = 12
77
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" != 12"]
78
+
79
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
80
+ condition.value = nil
81
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" IS NOT NULL"]
82
+
83
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
84
+ condition.value = (1..100)
85
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" NOT BETWEEN 1 AND 100"]
86
+
87
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:does_not_equal, Account, Account.columns_hash["id"])
88
+ condition.value = [1,2,3,4,5]
89
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" NOT IN (1,2,3,4,5)"]
90
+
91
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:begins_with, Account, Account.columns_hash["name"])
92
+ condition.value = "Binary"
93
+ assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ?", "Binary%"]
94
+
95
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:contains, Account, Account.columns_hash["name"])
96
+ condition.value = "Binary"
97
+ assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ?", "%Binary%"]
98
+
99
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:ends_with, Account, Account.columns_hash["name"])
100
+ condition.value = "Binary"
101
+ assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ?", "%Binary"]
102
+
103
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:greater_than, Account, Account.columns_hash["id"])
104
+ condition.value = 2
105
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" > ?", 2]
106
+
107
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:greater_than_or_equal_to, Account, Account.columns_hash["id"])
108
+ condition.value = 2
109
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" >= ?", 2]
110
+
111
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:keywords, Account, Account.columns_hash["name"])
112
+ condition.value = "freedom yeah, freedom YEAH right"
113
+ assert_equal condition.sanitize, ["\"accounts\".\"name\" LIKE ? AND \"accounts\".\"name\" LIKE ? AND \"accounts\".\"name\" LIKE ?", "%freedom%", "%yeah%", "%right%"]
114
+
115
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:keywords, Account, Account.columns_hash["name"])
116
+ condition.value = "$^&*()!"
117
+ assert_equal condition.sanitize, [""]
118
+
119
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:less_than, Account, Account.columns_hash["id"])
120
+ condition.value = 2
121
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" < ?", 2]
122
+
123
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:less_than_or_equal_to, Account, Account.columns_hash["id"])
124
+ condition.value = 2
125
+ assert_equal condition.sanitize, ["\"accounts\".\"id\" <= ?", 2]
126
+
127
+ assert_raise(ArgumentError) { BinaryLogic::Searchgasm::Search::Condition.new(:descendent_of, Account, nil) }
128
+
129
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:child_of, User, nil)
130
+ condition.value = 1
131
+ assert_equal condition.sanitize, ["\"users\".\"parent_id\" = ?", 1]
132
+
133
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:sibling_of, User, nil)
134
+ condition.value = 2
135
+ assert_equal condition.sanitize, ["\"users\".\"parent_id\" = ?", 1]
136
+
137
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:descendent_of, User, nil)
138
+ condition.value = 1
139
+ assert_equal condition.sanitize, ["\"users\".\"id\" = ? OR \"users\".\"id\" = ?", 2, 3]
140
+
141
+ condition = BinaryLogic::Searchgasm::Search::Condition.new(:inclusive_descendent_of, User, nil)
142
+ condition.value = 1
143
+ assert_equal condition.sanitize, ["(\"users\".\"id\" = ?) OR (\"users\".\"id\" = ? OR \"users\".\"id\" = ?)", 1, 2, 3]
144
+ end
145
+
146
+ def test_value
147
+ end
148
+
149
+ end
@@ -0,0 +1,137 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSearchgasmConditions < Test::Unit::TestCase
4
+ fixtures :accounts, :users, :orders
5
+
6
+ def setup
7
+ setup_db
8
+ load_fixtures
9
+ end
10
+
11
+ def teardown
12
+ teardown_db
13
+ end
14
+
15
+ def test_initialize
16
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account, :name_contains => "Binary")
17
+ assert_equal conditions.klass, Account
18
+ assert_equal conditions.name_contains, "Binary"
19
+ end
20
+
21
+ def test_setting_conditions
22
+ [Account, User, Order].each do |klass|
23
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(klass)
24
+
25
+ klass.columns.each do |column|
26
+ value = column_value(column)
27
+ BinaryLogic::Searchgasm::Search::Conditions.conditions_for_column_type(column.type).each do |condition|
28
+ name = BinaryLogic::Searchgasm::Search::Condition.generate_name(column, condition)
29
+ conditions.send("#{name}=", value)
30
+ assert_equal conditions.send(name), value
31
+ BinaryLogic::Searchgasm::Search::Conditions.alias_conditions(condition).each do |alias_condition|
32
+ alias_name = BinaryLogic::Searchgasm::Search::Condition.generate_name(column, alias_condition)
33
+ conditions.send("#{alias_name}=", value)
34
+ assert_equal conditions.send(alias_name), value
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ def test_setting_associations
42
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account, :users => {:first_name_like => "Ben"})
43
+ assert_equal conditions.users.first_name_like, "Ben"
44
+
45
+ conditions.users.last_name_begins_with = "Ben"
46
+ assert_equal conditions.users.last_name_begins_with, "Ben"
47
+ end
48
+
49
+ def test_includes
50
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
51
+ assert_equal conditions.includes, nil
52
+
53
+ conditions.name_like = "Binary"
54
+ assert_equal conditions.includes, nil
55
+
56
+ conditions.users.first_name_like = "Ben"
57
+ assert_equal conditions.includes, :users
58
+
59
+ conditions.users.orders.description_like = "apple"
60
+ assert_equal conditions.includes, {:users => :orders}
61
+ end
62
+
63
+ def test_objects
64
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
65
+ assert_equal conditions.objects, []
66
+
67
+ conditions.name_contains = "Binary"
68
+ assert_equal conditions.objects.size, 1
69
+
70
+ conditions.users.first_name_contains = "Ben"
71
+ assert_equal conditions.objects.size, 2
72
+ end
73
+
74
+ def test_reset
75
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
76
+
77
+ conditions.name_contains = "Binary"
78
+ assert_equal conditions.objects.size, 1
79
+
80
+ conditions.reset_name_contains!
81
+ assert_equal conditions.objects, []
82
+
83
+ conditions.users.first_name_like = "Ben"
84
+ assert_equal conditions.objects.size, 1
85
+
86
+ conditions.reset_users!
87
+ assert_equal conditions.objects, []
88
+
89
+ conditions.name_begins_with ="Binary"
90
+ conditions.users.orders.total_gt = 200
91
+ conditions.users.first_name_keywords = "Silly name"
92
+ conditions.reset!
93
+ assert_equal conditions.objects, []
94
+ end
95
+
96
+ def test_sanitize
97
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
98
+ conditions.name_contains = "Binary"
99
+ conditions.id_gt = 5
100
+ now = Time.now
101
+ conditions.created_at_after = now
102
+ assert_equal conditions.sanitize, ["(\"accounts\".\"name\" LIKE ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"created_at\" > ?)", "%Binary%", 5, now]
103
+
104
+ # test out associations
105
+ conditions.users.first_name_like = "Ben"
106
+ conditions.users.id_gt = 10
107
+ conditions.users.orders.total_lt = 500
108
+ assert_equal conditions.sanitize, ["(\"accounts\".\"name\" LIKE ?) AND (\"accounts\".\"id\" > ?) AND (\"accounts\".\"created_at\" > ?) AND ((\"users\".\"first_name\" LIKE ?) AND (\"users\".\"id\" > ?) AND (\"orders\".\"total\" < ?))", "%Binary%", 5, now, "%Ben%", 10, 500]
109
+ end
110
+
111
+ def test_value
112
+ conditions = BinaryLogic::Searchgasm::Search::Conditions.new(Account)
113
+ now = Time.now
114
+ conditions.value = {:name_like => "Binary", :created_at_after => now}
115
+ assert_equal conditions.value, {:name_contains => "Binary", :created_at_greater_than => now}
116
+
117
+ conditions.value = "id in (1,2,3,4)"
118
+ assert_equal conditions.value, {}
119
+ assert_equal conditions.scope, "id in (1,2,3,4)"
120
+ end
121
+
122
+ private
123
+ def column_value(column)
124
+ case column.type
125
+ when :string, :text, :binary
126
+ Array.new(50) { (rand(122-97) + 97).chr }.join
127
+ when :integer
128
+ rand(99999)
129
+ when :float, :decimal
130
+ rand * 100
131
+ when :datetime, :timestamp, :time
132
+ Time.now
133
+ when :date
134
+ Date.today
135
+ end
136
+ end
137
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: searchgasm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Ben Johnson of Binary Logic
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-09-01 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activerecord
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: echoe
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description: Makes ActiveRecord searching easier, robust, and powerful. Automatic conditions, pagination support, object based searching, and more.
36
+ email: bjohnson@binarylogic.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - CHANGELOG
43
+ - lib/searchgasm/active_record/associations.rb
44
+ - lib/searchgasm/active_record/base.rb
45
+ - lib/searchgasm/active_record/protection.rb
46
+ - lib/searchgasm/helpers.rb
47
+ - lib/searchgasm/search/base.rb
48
+ - lib/searchgasm/search/condition.rb
49
+ - lib/searchgasm/search/conditions.rb
50
+ - lib/searchgasm/search/utilities.rb
51
+ - lib/searchgasm/version.rb
52
+ - lib/searchgasm.rb
53
+ - README.mdown
54
+ files:
55
+ - CHANGELOG
56
+ - init.rb
57
+ - lib/searchgasm/active_record/associations.rb
58
+ - lib/searchgasm/active_record/base.rb
59
+ - lib/searchgasm/active_record/protection.rb
60
+ - lib/searchgasm/helpers.rb
61
+ - lib/searchgasm/search/base.rb
62
+ - lib/searchgasm/search/condition.rb
63
+ - lib/searchgasm/search/conditions.rb
64
+ - lib/searchgasm/search/utilities.rb
65
+ - lib/searchgasm/version.rb
66
+ - lib/searchgasm.rb
67
+ - Manifest
68
+ - MIT-LICENSE
69
+ - Rakefile
70
+ - README.mdown
71
+ - test/fixtures/accounts.yml
72
+ - test/fixtures/orders.yml
73
+ - test/fixtures/users.yml
74
+ - test/libs/acts_as_tree.rb
75
+ - test/libs/rexml_fix.rb
76
+ - test/test_active_record_associations.rb
77
+ - test/test_active_record_base.rb
78
+ - test/test_active_record_protection.rb
79
+ - test/test_helper.rb
80
+ - test/test_searchgasm_base.rb
81
+ - test/test_searchgasm_condition.rb
82
+ - test/test_searchgasm_conditions.rb
83
+ - searchgasm.gemspec
84
+ has_rdoc: true
85
+ homepage: http://github.com/binarylogic/searchgasm
86
+ post_install_message:
87
+ rdoc_options:
88
+ - --line-numbers
89
+ - --inline-source
90
+ - --title
91
+ - Searchgasm
92
+ - --main
93
+ - README.mdown
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ version:
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "="
105
+ - !ruby/object:Gem::Version
106
+ version: "1.2"
107
+ version:
108
+ requirements: []
109
+
110
+ rubyforge_project: searchgasm
111
+ rubygems_version: 1.2.0
112
+ signing_key:
113
+ specification_version: 2
114
+ summary: Orgasmic ActiveRecord searching
115
+ test_files:
116
+ - test/test_active_record_associations.rb
117
+ - test/test_active_record_base.rb
118
+ - test/test_active_record_protection.rb
119
+ - test/test_helper.rb
120
+ - test/test_searchgasm_base.rb
121
+ - test/test_searchgasm_condition.rb
122
+ - test/test_searchgasm_conditions.rb