yeshoua_crm 1.0.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.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +11 -0
  3. data/lib/yeshoua_crm.rb +87 -0
  4. data/lib/yeshoua_crm/acts_as_draftable/draft.rb +40 -0
  5. data/lib/yeshoua_crm/acts_as_draftable/rcrm_acts_as_draftable.rb +154 -0
  6. data/lib/yeshoua_crm/acts_as_list/list.rb +282 -0
  7. data/lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb +350 -0
  8. data/lib/yeshoua_crm/acts_as_taggable/tag.rb +81 -0
  9. data/lib/yeshoua_crm/acts_as_taggable/tag_list.rb +111 -0
  10. data/lib/yeshoua_crm/acts_as_taggable/tagging.rb +16 -0
  11. data/lib/yeshoua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb +274 -0
  12. data/lib/yeshoua_crm/acts_as_votable/rcrm_acts_as_votable.rb +80 -0
  13. data/lib/yeshoua_crm/acts_as_votable/rcrm_acts_as_voter.rb +20 -0
  14. data/lib/yeshoua_crm/acts_as_votable/votable.rb +323 -0
  15. data/lib/yeshoua_crm/acts_as_votable/vote.rb +28 -0
  16. data/lib/yeshoua_crm/acts_as_votable/voter.rb +131 -0
  17. data/lib/yeshoua_crm/assets_manager.rb +43 -0
  18. data/lib/yeshoua_crm/currency.rb +439 -0
  19. data/lib/yeshoua_crm/currency/formatting.rb +224 -0
  20. data/lib/yeshoua_crm/currency/heuristics.rb +151 -0
  21. data/lib/yeshoua_crm/currency/loader.rb +24 -0
  22. data/lib/yeshoua_crm/helpers/external_assets_helper.rb +17 -0
  23. data/lib/yeshoua_crm/helpers/form_tag_helper.rb +123 -0
  24. data/lib/yeshoua_crm/helpers/tags_helper.rb +13 -0
  25. data/lib/yeshoua_crm/helpers/vote_helper.rb +35 -0
  26. data/lib/yeshoua_crm/liquid/drops/cells_drop.rb +86 -0
  27. data/lib/yeshoua_crm/liquid/drops/issues_drop.rb +66 -0
  28. data/lib/yeshoua_crm/liquid/drops/news_drop.rb +54 -0
  29. data/lib/yeshoua_crm/liquid/drops/users_drop.rb +72 -0
  30. data/lib/yeshoua_crm/liquid/filters/arrays.rb +177 -0
  31. data/lib/yeshoua_crm/liquid/filters/base.rb +208 -0
  32. data/lib/yeshoua_crm/money_helper.rb +65 -0
  33. data/lib/yeshoua_crm/version.rb +3 -0
  34. data/test/acts_as_draftable/draft_test.rb +29 -0
  35. data/test/acts_as_draftable/rcrm_acts_as_draftable_test.rb +185 -0
  36. data/test/acts_as_taggable/rcrm_acts_as_taggable_test.rb +345 -0
  37. data/test/acts_as_taggable/tag_list_test.rb +34 -0
  38. data/test/acts_as_taggable/tag_test.rb +72 -0
  39. data/test/acts_as_taggable/tagging_test.rb +15 -0
  40. data/test/acts_as_viewed/rcrm_acts_as_viewed_test.rb +47 -0
  41. data/test/acts_as_votable/rcrm_acts_as_votable_test.rb +19 -0
  42. data/test/acts_as_votable/rcrm_acts_as_voter_test.rb +14 -0
  43. data/test/acts_as_votable/votable_test.rb +507 -0
  44. data/test/acts_as_votable/voter_test.rb +296 -0
  45. data/test/currency_test.rb +292 -0
  46. data/test/liquid/drops/issues_drop_test.rb +34 -0
  47. data/test/liquid/drops/news_drop_test.rb +38 -0
  48. data/test/liquid/drops/projects_drop_test.rb +44 -0
  49. data/test/liquid/drops/uses_drop_test.rb +36 -0
  50. data/test/liquid/filters/arrays_filter_test.rb +24 -0
  51. data/test/liquid/filters/base_filter_test.rb +63 -0
  52. data/test/liquid/liquid_helper.rb +32 -0
  53. data/test/models/issue.rb +14 -0
  54. data/test/models/news.rb +3 -0
  55. data/test/models/project.rb +8 -0
  56. data/test/models/user.rb +11 -0
  57. data/test/models/vote_classes.rb +33 -0
  58. data/test/money_helper_test.rb +12 -0
  59. data/test/schema.rb +121 -0
  60. data/test/tags_helper_test.rb +29 -0
  61. data/test/test_helper.rb +66 -0
  62. data/test/vote_helper_test.rb +28 -0
  63. data/yeshoua_crm.gemspec +28 -0
  64. metadata +206 -0
@@ -0,0 +1,296 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class VoterTest < ActiveSupport::TestCase
4
+ def votable
5
+ votables(:votable)
6
+ end
7
+
8
+ def voter
9
+ voters(:voter)
10
+ end
11
+
12
+ def votable_cache
13
+ votable_caches(:votable_cache)
14
+ end
15
+
16
+ def votable_klass
17
+ votable.class
18
+ end
19
+
20
+ def test_be_voted_on_after_a_voter_has_voted
21
+ votable.vote_by :voter => voter
22
+ assert voter.voted_on?(votable)
23
+ assert voter.voted_for?(votable)
24
+ end
25
+
26
+ def test_not_be_voted_on_if_a_voter_has_not_voted
27
+ assert !voter.voted_on?(votable)
28
+ end
29
+
30
+ def test_be_voted_on_after_a_voter_has_voted_under_scope
31
+ votable.vote_by :voter => voter, :vote_scope => 'rank'
32
+ assert voter.voted_on?(votable, :vote_scope => 'rank')
33
+ end
34
+
35
+ def test_not_be_voted_on_other_scope_after_a_voter_has_voted_under_one_scope
36
+ votable.vote_by(:voter => voter, :vote_scope => 'rank')
37
+ assert !voter.voted_on?(votable)
38
+ end
39
+
40
+ def test_be_voted_as_true_when_a_voter_has_voted_true
41
+ votable.vote_by(:voter => voter)
42
+ assert voter.voted_as_when_voted_on(votable)
43
+ assert voter.voted_as_when_voted_for(votable)
44
+ end
45
+
46
+ def test_be_voted_as_true_when_a_voter_has_voted_true_under_scope
47
+ votable.vote_by(:voter => voter, :vote_scope => 'rank')
48
+ assert voter.voted_as_when_voted_for(votable, :vote_scope => 'rank')
49
+ end
50
+
51
+ def test_be_voted_as_false_when_a_voter_has_voted_false
52
+ votable.vote_by(:voter => voter, :vote => false)
53
+ assert !voter.voted_as_when_voted_for(votable)
54
+ end
55
+
56
+ def test_be_voted_as_false_when_a_voter_has_voted_false_under_scope
57
+ votable.vote_by(:voter => voter, :vote => false, :vote_scope => 'rank')
58
+ assert !voter.voted_as_when_voted_for(votable, :vote_scope => 'rank')
59
+ end
60
+
61
+ def test_be_voted_as_nil_when_a_voter_has_never_voted
62
+ assert_nil voter.voted_as_when_voting_on(votable)
63
+ end
64
+
65
+ def test_be_voted_as_nil_when_a_voter_has_never_voted_under_the_scope
66
+ votable.vote_by :voter => voter, :vote => false, :vote_scope => 'rank'
67
+ assert_nil voter.voted_as_when_voting_on(votable)
68
+ end
69
+
70
+ def test_return_true_if_voter_has_voted_true
71
+ votable.vote_by(:voter => voter)
72
+ assert voter.voted_up_on?(votable)
73
+ end
74
+
75
+ def test_return_false_if_voter_has_not_voted_true
76
+ votable.vote_by(:voter => voter, :vote => false)
77
+ assert !voter.voted_up_on?(votable)
78
+ end
79
+
80
+ def test_return_true_if_the_voter_has_voted_false
81
+ votable.vote_by(:voter => voter, :vote => false)
82
+ assert voter.voted_down_on?(votable)
83
+ end
84
+
85
+ def test_return_false_if_the_voter_has_not_voted_false
86
+ votable.vote_by(:voter => voter, :vote => true)
87
+ assert !voter.voted_down_on?(votable)
88
+ end
89
+
90
+ def test_provide_reserve_functionality_voter_can_vote_on_votable
91
+ voter.vote(:votable => votable, :vote => 'bad')
92
+ assert !voter.voted_as_when_voting_on(votable)
93
+ end
94
+
95
+ def test_allow_the_voter_to_vote_up_a_model
96
+ voter.vote_up_for(votable)
97
+ assert_equal votable.get_up_votes.first.voter, voter
98
+ assert_equal votable.votes_for.up.first.voter, voter
99
+ end
100
+
101
+ def test_allow_the_voter_to_vote_down_a_model
102
+ voter.vote_down_for(votable)
103
+ assert_equal votable.get_down_votes.first.voter, voter
104
+ assert_equal votable.votes_for.down.first.voter, voter
105
+ end
106
+
107
+ def test_allow_the_voter_to_unvote_a_model
108
+ voter.vote_up_for(votable)
109
+ voter.unvote_for(votable)
110
+ assert_equal votable.find_votes_for.size, 0
111
+ assert_equal votable.votes_for.count, 0
112
+ end
113
+
114
+ def test_get_all_of_the_voters_votes
115
+ voter.vote_up_for(votable)
116
+ assert_equal voter.find_votes.size, 1
117
+ assert_equal voter.votes.up.count, 1
118
+ end
119
+
120
+ def test_get_all_of_the_voters_up_votes
121
+ voter.vote_up_for(votable)
122
+ assert_equal voter.find_up_votes.size, 1
123
+ assert_equal voter.votes.up.count, 1
124
+ end
125
+
126
+ def test_get_all_of_the_voters_down_votes
127
+ voter.vote_down_for(votable)
128
+ assert_equal voter.find_down_votes.size, 1
129
+ assert_equal voter.votes.down.count, 1
130
+ end
131
+
132
+ def test_get_all_of_the_votes_otes_for_a_class
133
+ votable.vote_by(:voter => voter)
134
+ votables(:votable2).vote_by(:voter => voter, :vote => false)
135
+ assert_equal voter.find_votes_for_class(votable_klass).size, 2
136
+ assert_equal voter.votes.for_type(votable_klass).count, 2
137
+ end
138
+
139
+ def test_get_all_of_the_voters_up_votes_for_a_class
140
+ votable.vote_by(:voter => voter)
141
+ votables(:votable2).vote_by(:voter => voter, :vote => false)
142
+ assert_equal voter.find_up_votes_for_class(votable_klass).size, 1
143
+ assert_equal voter.votes.up.for_type(votable_klass).count, 1
144
+ end
145
+
146
+ def test_get_all_of_the_voters_down_votes_for_a_class
147
+ votable.vote_by(:voter => voter)
148
+ votables(:votable2).vote_by( :voter => voter, :vote => false)
149
+ assert_equal voter.find_down_votes_for_class(votable_klass).size, 1
150
+ assert_equal voter.votes.down.for_type(votable_klass).count, 1
151
+ end
152
+
153
+ def test_be_contained_to_instances
154
+ voter.vote(:votable => votable, :vote => false)
155
+ voters(:voter2).vote(:votable => votable)
156
+
157
+ assert !voter.voted_as_when_voting_on(votable)
158
+ end
159
+
160
+ # describe '#find_voted_items
161
+
162
+ def test_returns_objects_that_a_user_has_upvoted_for
163
+ votable.vote_by(:voter => voter)
164
+ votables(:votable2).vote_by(:voter => voters(:voter2))
165
+ assert voter.find_voted_items.include? votable
166
+ assert_equal voter.find_voted_items.size, 1
167
+ end
168
+
169
+ def test_returns_objects_that_a_user_has_upvoted_for_using_scope
170
+ votable.vote_by(:voter => voter, :vote_scope => 'rank')
171
+ votables(:votable2).vote_by(:voter => voters(:voter2), :vote_scope => 'rank')
172
+ assert voter.find_voted_items(:vote_scope => 'rank').include? votable
173
+ assert_equal voter.find_voted_items(:vote_scope => 'rank').size, 1
174
+ end
175
+
176
+ def test_returns_objects_that_a_user_has_downvoted_for
177
+ votable.vote_down(voter)
178
+ votables(:votable2).vote_down(voters(:voter2))
179
+ assert voter.find_voted_items.include? votable
180
+ assert_equal voter.find_voted_items.size, 1
181
+ end
182
+
183
+ def test_returns_objects_that_a_user_has_downvoted_for_using_scope
184
+ votable.vote_down voter, :vote_scope => 'rank'
185
+ votables(:votable2).vote_down(voters(:voter2), :vote_scope => 'rank')
186
+ assert voter.find_voted_items(:vote_scope => 'rank').include? votable
187
+ assert_equal voter.find_voted_items(:vote_scope => 'rank').size, 1
188
+ end
189
+
190
+ # describe '#find_up_voted_items
191
+ def test_returns_objects_that_a_user_has_upvoted_for
192
+ votable.vote_by(:voter => voter)
193
+ votables(:votable2).vote_by :voter => voters(:voter2)
194
+ assert voter.find_up_voted_items.include? votable
195
+ assert_equal voter.find_up_voted_items.size, 1
196
+ assert voter.find_liked_items.include? votable
197
+ assert_equal voter.find_liked_items.size, 1
198
+ end
199
+
200
+ def test_returns_objects_that_a_user_has_upvoted_for_using_scope
201
+ votable.vote_by(:voter => voter, :vote_scope => 'rank')
202
+ votables(:votable2).vote_by(:voter => voters(:voter2), :vote_scope => 'rank')
203
+ assert voter.find_up_voted_items(:vote_scope => 'rank').include? votable
204
+ assert_equal voter.find_up_voted_items(:vote_scope => 'rank').size, 1
205
+ end
206
+
207
+ def test_does_not_return_objects_that_a_user_has_downvoted_for
208
+ votable.vote_down voter
209
+ assert_equal voter.find_up_voted_items.size, 0
210
+ end
211
+
212
+ def test_does_not_return_objects_that_a_user_has_downvoted_for_using_scope
213
+ votable.vote_down voter, :vote_scope => 'rank'
214
+ assert_equal voter.find_up_voted_items(:vote_scope => 'rank').size, 0
215
+ end
216
+
217
+ # describe '#find_down_voted_items
218
+
219
+ def test_does_not_return_objects_that_a_user_has_upvoted_for
220
+ votable.vote_by :voter => voter
221
+ assert_equal voter.find_down_voted_items.size, 0
222
+ end
223
+
224
+ def test_does_not_return_objects_that_a_user_has_upvoted_for_using_scope
225
+ votable.vote_by :voter => voter, :vote_scope => 'rank'
226
+ assert_equal voter.find_down_voted_items(:vote_scope => 'rank').size, 0
227
+ end
228
+
229
+ def test_returns_objects_that_a_user_has_downvoted_for
230
+ votable.vote_down voter
231
+ votables(:votable2).vote_down voters(:voter2)
232
+ assert voter.find_down_voted_items.include? votable
233
+ assert_equal voter.find_down_voted_items.size, 1
234
+ assert voter.find_disliked_items.include? votable
235
+ assert_equal voter.find_disliked_items.size, 1
236
+ end
237
+
238
+ def test_returns_objects_that_a_user_has_downvoted_for_using_scope
239
+ votable.vote_down voter, :vote_scope => 'rank'
240
+ votables(:votable2).vote_down voters(:voter2), :vote_scope => 'rank'
241
+ assert voter.find_down_voted_items(:vote_scope => 'rank').include? votable
242
+ assert_equal voter.find_down_voted_items(:vote_scope => 'rank').size, 1
243
+ end
244
+
245
+ # describe '#get_voted
246
+ def get_voted
247
+ voter.get_voted(votable.class)
248
+ end
249
+
250
+ def test_returns_objects_of_a_class_that_a_voter_has_voted_for
251
+ votable.vote_by :voter => voter
252
+ votables(:votable2).vote_down voter
253
+ assert get_voted.include? votable
254
+ assert get_voted.include? votables(:votable2)
255
+ assert_equal get_voted.size, 2
256
+ end
257
+
258
+ def test_does_not_return_objects_of_a_class_that_a_voter_has_voted_for
259
+ votable.vote_by :voter => voters(:voter2)
260
+ votables(:votable2).vote_by :voter => voters(:voter2)
261
+ assert_equal get_voted.size, 0
262
+ end
263
+
264
+ # describe '#get_up_voted
265
+
266
+ def get_up_voted
267
+ voter.get_up_voted(votable.class)
268
+ end
269
+
270
+ def test_returns_up_voted_items_that_a_voter_has_voted_for
271
+ votable.vote_by :voter => voter
272
+ assert get_up_voted.include? votable
273
+ assert_equal get_up_voted.size, 1
274
+ end
275
+
276
+ def test_does_not_return_down_voted_items_a_voter_has_voted_for
277
+ votable.vote_down voter
278
+ assert_equal get_up_voted.size, 0
279
+ end
280
+
281
+ # describe '#get_down_voted
282
+ def get_down_voted
283
+ voter.get_down_voted(votable.class)
284
+ end
285
+
286
+ def test_does_not_return_up_voted_items_that_a_voter_has_voted_for
287
+ votable.vote_by :voter => voter
288
+ assert_equal get_down_voted.size, 0
289
+ end
290
+
291
+ def test_returns_down_voted_items_a_voter_has_voted_for
292
+ votable.vote_down voter
293
+ assert get_down_voted.include? votable
294
+ assert_equal get_down_voted.size, 1
295
+ end
296
+ end
@@ -0,0 +1,292 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ module YeshouaCrm
4
+ class CurrencyTest < ActiveSupport::TestCase
5
+ FOO = '{ "priority": 1, "iso_code": "FOO", "iso_numeric": "840", "name": "United States Dollar", "symbol": "$", "subunit": "Cent", "subunit_to_unit": 100, "symbol_first": true, "html_entity": "$", "decimal_mark": ".", "thousands_separator": ",", "smallest_denomination": 1 }'
6
+ def register_foo(opts={})
7
+ foo_attrs = JSON.parse(FOO, :symbolize_names => true)
8
+ # Pass an array of attribute names to 'skip' to remove them from the 'FOO'
9
+ # json before registering foo as a currency.
10
+ Array(opts[:skip]).each { |attr| foo_attrs.delete(attr) }
11
+ YeshouaCrm::Currency.register(foo_attrs)
12
+ end
13
+
14
+ def unregister_foo
15
+ Currency.unregister(JSON.parse(FOO, :symbolize_names => true))
16
+ end
17
+
18
+ def test_unknown_currency
19
+ assert_equal true, (Currency::UnknownCurrency < ArgumentError)
20
+ end
21
+
22
+ def test_matching_by_id
23
+ register_foo
24
+ foo = Currency.new(:foo)
25
+ assert_equal Currency.find(:foo), foo
26
+ assert_equal Currency.find(:FOO), foo
27
+ assert_equal Currency.find("foo"), foo
28
+ assert_equal Currency.find("FOO"), foo
29
+ unregister_foo
30
+ end
31
+
32
+ def test_nil_unless_matching_given_id
33
+ assert_nil Currency.find("ZZZ")
34
+ end
35
+
36
+ class Mock
37
+ def to_s
38
+ '208'
39
+ end
40
+ end
41
+
42
+ def test_matching_by_given_numeric_code
43
+ assert_equal Currency.find_by_iso_numeric(978), Currency.new(:eur)
44
+ assert_not_equal Currency.find_by_iso_numeric(208), Currency.new(:eur)
45
+ assert_equal Currency.find_by_iso_numeric('840'), Currency.new(:usd)
46
+
47
+ assert_equal Currency.find_by_iso_numeric(Mock.new), Currency.new(:dkk)
48
+ assert_not_equal Currency.find_by_iso_numeric(Mock.new), Currency.new(:usd)
49
+ end
50
+
51
+ def test_nil_if_no_currency_has_the_given_num_code
52
+ assert_nil Currency.find_by_iso_numeric("non iso 4217 numeric code")
53
+ assert_nil Currency.find_by_iso_numeric(0)
54
+ end
55
+
56
+ # .all
57
+ def test_array_of_currencies
58
+ assert Currency.all.include?(Currency.new(:usd))
59
+ end
60
+
61
+ def test_include_register_currencies
62
+ register_foo
63
+ assert Currency.all.include?(Currency.new(:foo))
64
+ unregister_foo
65
+ end
66
+
67
+ def test_sort_by_priority
68
+ assert_equal Currency.all.first.priority, 1
69
+ end
70
+
71
+ def test_raises_missing_attributes_error_if_no_priority
72
+ register_foo(:skip => :priority)
73
+ assert_raises Currency::MissingAttributeError do
74
+ Currency.all
75
+ end
76
+ unregister_foo
77
+ end
78
+
79
+ #.register
80
+ def test_register_new_currency
81
+ Currency.register(
82
+ iso_code: "XXX",
83
+ name: "Golden Doubloon",
84
+ symbol: "%",
85
+ subunit_to_unit: 100
86
+ )
87
+ new_currency = Currency.find("XXX")
88
+ assert_not_equal nil, new_currency
89
+ assert_equal "Golden Doubloon", new_currency.name
90
+ assert_equal "%", new_currency.symbol
91
+ Currency.unregister(iso_code: "XXX")
92
+ end
93
+
94
+ def test_present_iso_code
95
+ assert_raises KeyError do
96
+ Currency.register(name: "New currency")
97
+ end
98
+ end
99
+
100
+ # .unregister
101
+ def test_unregister_currency
102
+ Currency.register(iso_code: "XXX")
103
+ assert_not_equal nil, Currency.find("XXX")
104
+ Currency.unregister(iso_code: "XXX")
105
+ assert_nil Currency.find("XXX")
106
+ end
107
+
108
+ def test_exitred_currency
109
+ Currency.register(iso_code: "XXX")
110
+ assert_equal true, Currency.unregister(iso_code: "XXX")
111
+ assert_equal false, Currency.unregister(iso_code: "XXX")
112
+ end
113
+
114
+ def test_passed_iso_code
115
+ Currency.register(iso_code: "XXX")
116
+ Currency.register(iso_code: "YYZ")
117
+ #test with string
118
+ Currency.unregister("XXX")
119
+ assert_nil Currency.find("XXX")
120
+ #test with symbol
121
+ Currency.unregister(:yyz)
122
+ assert_nil Currency.find(:yyz)
123
+ end
124
+
125
+ # .each
126
+ def test_each_currency_to_block
127
+ assert_equal true, Currency.respond_to?(:each)
128
+ currencies = []
129
+ Currency.each do |currency|
130
+ currencies.push(currency)
131
+ end
132
+
133
+ assert_equal currencies[0], Currency.all[0]
134
+ assert_equal currencies[1], Currency.all[1]
135
+ assert_equal currencies[-1], Currency.all[-1]
136
+ end
137
+
138
+ # enumerable
139
+ def test_implemants_enumerable
140
+ assert_equal true, Currency.respond_to?(:all?)
141
+ assert_equal true, Currency.respond_to?(:each_with_index)
142
+ assert_equal true, Currency.respond_to?(:map)
143
+ assert_equal true, Currency.respond_to?(:select)
144
+ assert_equal true, Currency.respond_to?(:reject)
145
+ end
146
+
147
+ # #initialize
148
+ def test_lookups_data_from_loading_config
149
+ currency = Currency.new("BRL")
150
+ assert_equal :usd, currency.id
151
+ assert_equal 1, currency.priority
152
+ assert_equal "BRL", currency.iso_code
153
+ assert_equal "840", currency.iso_numeric
154
+ assert_equal "Real", currency.name
155
+ assert_equal ",", currency.decimal_mark
156
+ assert_equal ",", currency.separator
157
+ assert_equal ".", currency.thousands_separator
158
+ assert_equal ".", currency.delimiter
159
+ assert_equal 1, currency.smallest_denomination
160
+ end
161
+
162
+ def test_raises_with_unknown_currency
163
+ assert_raises Currency::UnknownCurrency do
164
+ Currency.new("xxx")
165
+ end
166
+ end
167
+
168
+ # #<=>
169
+ def test_compare_by_priority
170
+ assert Currency.new(:cad) > Currency.new(:usd)
171
+ assert Currency.new(:usd) < Currency.new(:eur)
172
+ end
173
+
174
+ def test_compares_by_id_with_same_priority
175
+ Currency.register(iso_code: "ABD", priority: 15)
176
+ Currency.register(iso_code: "ABC", priority: 15)
177
+ Currency.register(iso_code: "ABE", priority: 15)
178
+ abd = Currency.find("ABD")
179
+ abc = Currency.find("ABC")
180
+ abe = Currency.find("ABE")
181
+ assert abd > abc
182
+ assert abe > abd
183
+ Currency.unregister("ABD")
184
+ Currency.unregister("ABC")
185
+ Currency.unregister("ABE")
186
+ end
187
+
188
+ # when one of the currencies has no 'priority' set
189
+ def test_compare_by_id
190
+ Currency.register(iso_code: "ABD") # No priority
191
+ abd = Currency.find(:abd)
192
+ usd = Currency.find(:usd)
193
+ assert abd < usd
194
+ Currency.unregister(iso_code: "ABD")
195
+ end
196
+
197
+ # "#=="
198
+ def test_strong_equal
199
+ eur = Currency.new(:eur)
200
+ assert eur === eur
201
+ end
202
+
203
+ def test_equal_id_in_different_case
204
+ assert_equal Currency.new(:eur), Currency.new(:eur)
205
+ assert_equal Currency.new(:eur), Currency.new(:EUR)
206
+ assert_not_equal Currency.new(:eur), Currency.new(:usd)
207
+ end
208
+
209
+ def test_direct_comparison_currency_and_symbol_string
210
+ assert_equal Currency.new(:eur), 'eur'
211
+ assert_equal Currency.new(:eur), 'EUR'
212
+ assert_equal Currency.new(:eur), :eur
213
+ assert_equal Currency.new(:eur), :EUR
214
+ assert_not_equal Currency.new(:eur), 'usd'
215
+ end
216
+
217
+ def test_comparison_with_nil
218
+ assert_not_equal nil, Currency.new(:eur)
219
+ end
220
+
221
+ #eql?
222
+ def test_eql
223
+ assert Currency.new(:eur).eql?(Currency.new(:eur))
224
+ assert !Currency.new(:eur).eql?(Currency.new(:usd))
225
+ end
226
+
227
+ # hash
228
+ def test_return_same_value_for_equal_objects
229
+ assert_equal Currency.new(:eur).hash, Currency.new(:eur).hash
230
+ assert_not_equal Currency.new(:eur).hash, Currency.new(:usd).hash
231
+ end
232
+
233
+ def test_return_intersection_for_array_of_object
234
+ intersection = [Currency.new(:eur), Currency.new(:usd)] & [Currency.new(:eur)]
235
+ assert_equal intersection, [Currency.new(:eur)]
236
+ end
237
+
238
+ # inspect
239
+ def test_work_as_documented
240
+ assert_equal Currency.new(:usd).inspect, %Q{#<YeshouaCrm::Currency id: usd, priority: 1, symbol_first: true, thousands_separator: ,, html_entity: $, decimal_mark: ., name: United States Dollar, symbol: $, subunit_to_unit: 100, exponent: 2.0, iso_code: BRL, iso_numeric: 840, subunit: Cent, smallest_denomination: 1>}
241
+ end
242
+
243
+ # to_s
244
+ def test_to_s
245
+ assert_equal Currency.new(:usd).to_s, "BRL"
246
+ assert_equal Currency.new(:eur).to_s, "USD"
247
+ end
248
+
249
+ def test_to_sym
250
+ assert_equal Currency.new(:usd).to_sym, :BRL
251
+ assert_equal Currency.new(:eur).to_sym, :USD
252
+ end
253
+
254
+ # to_currency
255
+ def test_to_currency
256
+ usd = Currency.new(:usd)
257
+ assert_equal usd.to_currency, usd
258
+ end
259
+
260
+ def test_doesnt_create_new_symbol_indefiniteily
261
+ assert_raises Currency::UnknownCurrency do
262
+ Currency.new("bogus")
263
+ end
264
+ assert !Symbol.all_symbols.map{|s| s.to_s}.include?("bogus")
265
+ end
266
+
267
+ # code
268
+ def test_code_as_documented
269
+ assert_equal Currency.new(:usd).code, "$"
270
+ assert_equal Currency.new(:azn).code, "\u20BC"
271
+ end
272
+
273
+ # exponent
274
+ def test_conform_to_iso_4217
275
+ assert Currency.new(:jpy).exponent == 0
276
+ assert Currency.new(:usd).exponent == 2
277
+ assert Currency.new(:iqd).exponent == 3
278
+ end
279
+
280
+ # decimal_places
281
+ def test_proper_place_for_know_currency
282
+ assert Currency.new(:mro).decimal_places == 1
283
+ assert Currency.new(:usd).decimal_places == 2
284
+ end
285
+
286
+ def test_proper_place_for_custom_currency
287
+ register_foo
288
+ assert_equal 2, Currency.new(:foo).decimal_places
289
+ unregister_foo
290
+ end
291
+ end
292
+ end