test_redmine_vz 0.0.24

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 (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/README.md +71 -0
  5. data/Rakefile +20 -0
  6. data/config/currency_iso.json +2532 -0
  7. data/doc/CHANGELOG +55 -0
  8. data/doc/LICENSE.txt +339 -0
  9. data/lib/redmine_crm.rb +67 -0
  10. data/lib/redmine_crm/currency.rb +439 -0
  11. data/lib/redmine_crm/currency/formatting.rb +227 -0
  12. data/lib/redmine_crm/currency/heuristics.rb +151 -0
  13. data/lib/redmine_crm/currency/loader.rb +24 -0
  14. data/lib/redmine_crm/helpers/tags_helper.rb +15 -0
  15. data/lib/redmine_crm/helpers/vote_helper.rb +38 -0
  16. data/lib/redmine_crm/liquid/drops/issues_drop.rb +61 -0
  17. data/lib/redmine_crm/liquid/drops/news_drop.rb +45 -0
  18. data/lib/redmine_crm/liquid/drops/projects_drop.rb +78 -0
  19. data/lib/redmine_crm/liquid/drops/users_drop.rb +59 -0
  20. data/lib/redmine_crm/liquid/filters.rb +85 -0
  21. data/lib/redmine_crm/money_helper.rb +67 -0
  22. data/lib/redmine_crm/rcrm_acts_as_taggable.rb +342 -0
  23. data/lib/redmine_crm/rcrm_acts_as_viewed.rb +287 -0
  24. data/lib/redmine_crm/rcrm_acts_as_votable.rb +79 -0
  25. data/lib/redmine_crm/rcrm_acts_as_voter.rb +27 -0
  26. data/lib/redmine_crm/tag.rb +81 -0
  27. data/lib/redmine_crm/tag_list.rb +112 -0
  28. data/lib/redmine_crm/tagging.rb +20 -0
  29. data/lib/redmine_crm/version.rb +3 -0
  30. data/lib/redmine_crm/votable.rb +334 -0
  31. data/lib/redmine_crm/vote.rb +30 -0
  32. data/lib/redmine_crm/voter.rb +136 -0
  33. data/redmine_crm.gemspec +22 -0
  34. data/test/acts_as_taggable_test.rb +384 -0
  35. data/test/currency_test.rb +292 -0
  36. data/test/database.yml +17 -0
  37. data/test/fixtures/issue.rb +14 -0
  38. data/test/fixtures/issues.yml +12 -0
  39. data/test/fixtures/taggings.yml +32 -0
  40. data/test/fixtures/tags.yml +11 -0
  41. data/test/fixtures/user.rb +7 -0
  42. data/test/fixtures/users.yml +5 -0
  43. data/test/fixtures/votable_caches.yml +2 -0
  44. data/test/fixtures/votables.yml +4 -0
  45. data/test/fixtures/vote_classes.rb +54 -0
  46. data/test/fixtures/voters.yml +6 -0
  47. data/test/liquid_test.rb +80 -0
  48. data/test/money_helper_test.rb +12 -0
  49. data/test/schema.rb +100 -0
  50. data/test/tag_test.rb +63 -0
  51. data/test/tagging_test.rb +14 -0
  52. data/test/tags_helper_test.rb +29 -0
  53. data/test/test_helper.rb +118 -0
  54. data/test/viewed_test.rb +45 -0
  55. data/test/votable_model_test.rb +478 -0
  56. data/test/votable_test.rb +17 -0
  57. data/test/vote_helper_test.rb +28 -0
  58. data/test/voter_model_test.rb +296 -0
  59. metadata +141 -0
@@ -0,0 +1,6 @@
1
+ voter:
2
+ name: 'i can vote!'
3
+ voter2:
4
+ name: 'a new person'
5
+ voter3:
6
+ name: 'another person'
@@ -0,0 +1,80 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ module RedmineCrm
4
+ class LiquidTest < ActiveSupport::TestCase
5
+ def test_today_filter
6
+ assert_match Date.today.strftime(date_format), render('{{today}}')
7
+ end
8
+
9
+ def test_plus_days_filter
10
+ assert_match (Date.today + 3.days).strftime(date_format), render("{{today | plus_days: 3 | date: '#{date_format}'}}")
11
+ end
12
+
13
+ def test_date_range_filter
14
+ assert_equal '10', render("{{today | date_range: '#{Date.today - 10.days}'}}")
15
+ end
16
+
17
+ # RedCloth3 is a part of Redmine - test will not work
18
+ # def test_textilize_filter
19
+ # assert_match '<h1>Some text</h1>', render("{{ 'Some text' | textilize }}")
20
+ # end
21
+
22
+ def test_underscore_filter
23
+ assert_match 'some_text', render("{{ 'some text' | underscore }}")
24
+ end
25
+
26
+ def test_dasherize_filter
27
+ assert_match 'some-text', render("{{ 'some text' | dasherize }}")
28
+ end
29
+
30
+ def test_random_filter
31
+ assert render("{{ random: 10 }}").to_i <= 10
32
+ end
33
+
34
+ def test_user_drop
35
+ user = User.first
36
+ assert_match user.name, render("{{ user.name }}")
37
+ end
38
+
39
+ def test_users_drop
40
+ users_name = User.all.map(&:name)
41
+ rendered_text = render("{% for user in users %} {{user.name }} {% endfor %}")
42
+ users_name.each do |name|
43
+ assert_match name, rendered_text
44
+ end
45
+ end
46
+
47
+ def test_issue_drop
48
+ assert_match Issue.first.description, render("{{ issue.description }}")
49
+ end
50
+
51
+ def test_default_filter
52
+ user = User.first
53
+ user.name = nil
54
+ user.save
55
+ assert_match 'user', render("{{ user.name | default: 'user' }}")
56
+ end
57
+
58
+ private
59
+
60
+ def render(content)
61
+ assigns = {}
62
+ assigns['now'] = Time.now
63
+ assigns['today'] = Date.today.strftime(date_format)
64
+ assigns['user'] = Liquid::UserDrop.new(User.first)
65
+ assigns['users'] = Liquid::UsersDrop.new(User.all)
66
+ assigns['issue'] = Liquid::IssueDrop.new(Issue.first)
67
+
68
+ registers = {}
69
+ begin
70
+ ::Liquid::Template.parse(content).render(::Liquid::Context.new({}, assigns, registers)).html_safe
71
+ rescue => e
72
+ e.message
73
+ end
74
+ end
75
+
76
+ def date_format
77
+ '%d.%m.%Y'
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class MoneyHelperTest < ActiveSupport::TestCase
4
+ include RedmineCrm::MoneyHelper
5
+
6
+ def test_price_to_currency
7
+ assert_equal '$3,265.65', price_to_currency(3265.65, "USD")
8
+ assert_equal "3.265,65 ₽", price_to_currency(3265.65, "RUB")
9
+ assert_equal "3,200.0", price_to_currency(3200, "")
10
+ assert_equal "3,200.0", price_to_currency(3200, "Foo")
11
+ end
12
+ end
@@ -0,0 +1,100 @@
1
+ ActiveRecord::Schema.define :version => 0 do
2
+
3
+ create_table "tags", :force => true do |t|
4
+ t.column "name", :string
5
+ end
6
+
7
+ create_table "taggings", :force => true do |t|
8
+ t.column "tag_id", :integer
9
+ t.column "taggable_id", :integer
10
+ t.column "taggable_type", :string
11
+ t.column "created_at", :datetime
12
+ end
13
+
14
+
15
+ create_table "users", :force => true do |t|
16
+ t.column "name", :string
17
+ end
18
+
19
+ create_table "issues", :force => true do |t|
20
+ t.column "description", :string
21
+ t.column "closed", :boolean
22
+ t.column "cached_tag_list", :string
23
+ t.column "user_id", :integer
24
+ t.column "views", :integer, :default => 0
25
+ t.column "total_views", :integer, :default => 0
26
+ end
27
+
28
+ create_table "votes", :force => true do |t|
29
+ t.references "votable", :polymorphic => true
30
+ t.references "voter", :polymorphic => true
31
+
32
+ t.boolean "vote_flag"
33
+ t.string "vote_scope"
34
+ t.integer "vote_weight"
35
+
36
+ t.timestamps
37
+ end
38
+
39
+ # add_index :votes, [:votable_id, :votable_type]
40
+ # add_index :votes, [:voter_id, :voter_type]
41
+ # add_index :votes, [:voter_id, :voter_type, :vote_scope]
42
+ # add_index :votes, [:votable_id, :votable_type, :vote_scope]
43
+
44
+ create_table :voters, :force => true do |t|
45
+ t.string :name
46
+ end
47
+
48
+ create_table :not_voters, :force => true do |t|
49
+ t.string :name
50
+ end
51
+
52
+ create_table :votables, :force => true do |t|
53
+ t.string :name
54
+ end
55
+
56
+ create_table :votable_voters, :force => true do |t|
57
+ t.string :name
58
+ end
59
+
60
+ create_table :sti_votables, :force => true do |t|
61
+ t.string :name
62
+ t.string :type
63
+ end
64
+
65
+ create_table :sti_not_votables, :force => true do |t|
66
+ t.string :name
67
+ t.string :type
68
+ end
69
+
70
+ create_table :not_votables, :force => true do |t|
71
+ t.string :name
72
+ end
73
+
74
+ create_table :votable_caches, :force => true do |t|
75
+ t.string :name
76
+ t.integer :cached_votes_total
77
+ t.integer :cached_votes_score
78
+ t.integer :cached_votes_up
79
+ t.integer :cached_votes_down
80
+ t.integer :cached_weighted_total
81
+ t.integer :cached_weighted_score
82
+ t.float :cached_weighted_average
83
+
84
+ t.integer :cached_scoped_test_votes_total
85
+ t.integer :cached_scoped_test_votes_score
86
+ t.integer :cached_scoped_test_votes_up
87
+ t.integer :cached_scoped_test_votes_down
88
+ t.integer :cached_scoped_weighted_total
89
+ t.integer :cached_scoped_weighted_score
90
+ t.float :cached_scoped_weighted_average
91
+ end
92
+
93
+ create_table :viewings, :force => true do |t|
94
+ t.column :viewer_id, :integer
95
+ t.column :viewed_id, :integer
96
+ t.column :viewed_type, :string
97
+ t.column :ip, :string, :limit => '24'
98
+ t.column :created_at, :datetime
99
+ end
100
+ end
@@ -0,0 +1,63 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ module RedmineCrm
4
+ class TagTest < ActiveSupport::TestCase
5
+ def test_name_required
6
+ t = Tag.create
7
+ assert_match /blank/, t.errors[:name].to_s
8
+ end
9
+
10
+ def test_name_unique
11
+ t = Tag.create!(:name => "My tag")
12
+ duplicate = t.dup
13
+ assert !duplicate.save
14
+ assert_match /not uniq/, duplicate.errors[:name].to_s
15
+ end
16
+
17
+ def test_taggings
18
+ assert_equivalent [taggings(:tag_for_error), taggings(:tag_for_error1), taggings(:tag_for_error2)
19
+ ], tags(:error).taggings
20
+ assert_equivalent [taggings(:tag_for_question1), taggings(:tag_for_question2), taggings(:tag_for_question3)], tags(:question).taggings
21
+ end
22
+
23
+ def test_to_s
24
+ assert_equal tags(:error).name, tags(:error).to_s
25
+ end
26
+
27
+ def test_equality
28
+ assert_equal tags(:error), tags(:error)
29
+ assert_equal Tag.find(tags(:error).id), Tag.find(tags(:error).id)
30
+ assert_equal Tag.new(:name => 'A'), Tag.new(:name => 'A')
31
+ assert_not_equal Tag.new(:name => 'A'), Tag.new(:name => 'B')
32
+ end
33
+
34
+ def test_taggings_removed_when_tag_destroyed
35
+ assert_difference("Tagging.count", -Tagging.where(:tag_id => tags(:error).id).count) do
36
+ assert tags(:error).destroy
37
+ end
38
+ end
39
+
40
+ def test_all_counts
41
+ assert_tag_counts Tag.counts, :error => 3, :feature => 1, :bug => 1, :question => 3
42
+ end
43
+
44
+ def test_all_counts_with_string_conditions
45
+ assert_tag_counts Tag.counts(:conditions => 'taggings.created_at >= \'2015-01-01\''),
46
+ :question => 3, :error => 2, :feature => 1, :bug => 1
47
+ end
48
+
49
+ def test_all_counts_with_array_conditions
50
+ assert_tag_counts Tag.counts(:conditions => ['taggings.created_at >= ?', '2015-01-01']),
51
+ :question => 3, :error => 2, :feature => 1, :bug => 1
52
+ end
53
+
54
+ def test_all_counts_with_hash_conditions
55
+ tag_counts = Tag.counts(
56
+ :conditions => {
57
+ :taggings => { :created_at => (DateTime.parse('2014-12-31 23:59') .. DateTime.parse('4000-01-01')) }
58
+ }
59
+ )
60
+ assert_tag_counts tag_counts, :question => 3, :error => 2, :feature => 1, :bug => 1
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ # require File.dirname(__FILE__) + '/fixtures/issue'
3
+
4
+ class TaggingTest < ActiveSupport::TestCase
5
+
6
+ def test_tag
7
+ assert_equal tags(:error), taggings(:tag_for_error).tag
8
+ end
9
+
10
+ def test_taggable
11
+ assert_equal issues(:first_issue), taggings(:tag_for_error).taggable
12
+ end
13
+
14
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ # module RedmineCrm
4
+ class TagsHelperTest < ActiveSupport::TestCase
5
+ include RedmineCrm::TagsHelper
6
+
7
+ def test_tag_cloud
8
+ cloud_elements = []
9
+
10
+ tag_cloud Issue.tag_counts, %w(css1 css2 css3 css4) do |tag, css_class|
11
+ cloud_elements << [tag, css_class]
12
+ end
13
+ assert cloud_elements.include?([tags(:error), "css4"])
14
+ assert cloud_elements.include?([tags(:question), "css4"])
15
+ assert cloud_elements.include?([tags(:bug), "css2"])
16
+ assert cloud_elements.include?([tags(:feature), "css2"])
17
+ assert_equal 4, cloud_elements.size
18
+ end
19
+
20
+ # def test_tag_cloud_when_no_tags
21
+ # cloud_elements = []
22
+ # tag_cloud SpecialIssue.tag_counts, %w(css1) do |tag, css_class|
23
+ # # assert false, "tag_cloud should not yield"
24
+ # cloud_elements << [tag, css_class]
25
+ # end
26
+ # assert_equal 0, cloud_elements.size
27
+ # end
28
+ end
29
+ # end
@@ -0,0 +1,118 @@
1
+ require 'minitest/autorun'
2
+ require 'byebug'
3
+ # require 'test/unit'
4
+
5
+ begin
6
+ require File.dirname(__FILE__) + '/../../../../config/environment'
7
+ rescue LoadError
8
+ require 'rubygems'
9
+ gem 'activerecord', "4.2.7.1"
10
+ gem 'actionpack', "4.2.7.1"
11
+ require 'active_record'
12
+ # require 'action_controller'
13
+ end
14
+ require "redmine_crm"
15
+ require "active_record/fixtures"
16
+
17
+ require File.dirname(__FILE__) + '/../lib/redmine_crm/rcrm_acts_as_taggable'
18
+ require File.dirname(__FILE__) + '/../lib/redmine_crm/tag_list'
19
+ require File.dirname(__FILE__) + '/../lib/redmine_crm/tag'
20
+ require File.dirname(__FILE__) + '/../lib/redmine_crm/tagging'
21
+ require File.dirname(__FILE__) + '/../lib/redmine_crm/helpers/tags_helper'
22
+ require File.dirname(__FILE__) + '/../lib/redmine_crm/rcrm_acts_as_votable'
23
+ require File.dirname(__FILE__) + '/../lib/redmine_crm/rcrm_acts_as_voter'
24
+
25
+ # require_dependency File.dirname(__FILE__) + '/../lib/redmine_crm/tags_helper'
26
+
27
+ ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
28
+ ActiveRecord::Base.configurations = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
29
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ENV['DB'] || 'sqlite3'])
30
+
31
+ load(File.dirname(__FILE__) + '/schema.rb')
32
+ load(File.dirname(__FILE__) + '/fixtures/user.rb')
33
+ load(File.dirname(__FILE__) + '/fixtures/issue.rb')
34
+ load(File.dirname(__FILE__) + "/fixtures/vote_classes.rb")
35
+
36
+ # Dir["/fixtures/*.rb"].each{|file| load file}
37
+
38
+ class ActiveSupport::TestCase #:nodoc:
39
+ include ActiveRecord::TestFixtures
40
+
41
+ self.fixture_path = File.dirname(__FILE__) + "/fixtures/"
42
+
43
+ self.use_transactional_fixtures = true
44
+ self.use_instantiated_fixtures = false
45
+ set_fixture_class :tags => RedmineCrm::Tag
46
+ set_fixture_class :taggings => RedmineCrm::Tagging
47
+
48
+ set_fixture_class :votable_caches => VotableCache
49
+ fixtures :all
50
+
51
+ def assert_equivalent(expected, actual, message = nil)
52
+ if expected.first.is_a?(ActiveRecord::Base)
53
+ assert_equal expected.sort_by(&:id), actual.sort_by(&:id), message
54
+ else
55
+ assert_equal expected.sort, actual.sort, message
56
+ end
57
+ end
58
+
59
+ def assert_tag_counts(tags, expected_values)
60
+ # Map the tag fixture names to real tag names
61
+ expected_values = expected_values.inject({}) do |hash, (tag, count)|
62
+ hash[tags(tag).name] = count
63
+ hash
64
+ end
65
+
66
+ tags.each do |tag|
67
+ value = expected_values.delete(tag.name)
68
+
69
+ assert_not_nil value, "Expected count for #{tag.name} was not provided"
70
+ assert_equal value, tag.count, "Expected value of #{value} for #{tag.name}, but was #{tag.count}"
71
+ end
72
+
73
+ unless expected_values.empty?
74
+ assert false, "The following tag counts were not present: #{expected_values.inspect}"
75
+ end
76
+ end
77
+
78
+ # def assert_queries(num = 1)
79
+ # $query_count = 0
80
+ # yield
81
+ # ensure
82
+ # assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
83
+ # end
84
+
85
+ # def assert_queries(num = 1, options = {})
86
+ # ignore_none = options.fetch(:ignore_none) { num == :any }
87
+ # SQLCounter.clear_log
88
+ # yield
89
+ # ensure
90
+ # the_log = ignore_none ? SQLCounter.log_all : SQLCounter.log
91
+ # if num == :any
92
+ # assert_operator the_log.size, :>=, 1, "1 or more queries expected, but none were executed."
93
+ # else
94
+ # mesg = "#{the_log.size} instead of #{num} queries were executed.#{the_log.size == 0 ? '' : "\nQueries:\n#{the_log.join("\n")}"}"
95
+ # assert_equal num, the_log.size, mesg
96
+ # end
97
+ # end
98
+
99
+ def assert_no_queries(&block)
100
+ assert_queries(0, &block)
101
+ end
102
+
103
+ # From Rails trunk
104
+ def assert_difference(expressions, difference = 1, message = nil, &block)
105
+ expression_evaluations = [expressions].flatten.collect{|expression| lambda { eval(expression, block.binding) } }
106
+
107
+ original_values = expression_evaluations.inject([]) { |memo, expression| memo << expression.call }
108
+ yield
109
+ expression_evaluations.each_with_index do |expression, i|
110
+ assert_equal original_values[i] + difference, expression.call, message
111
+ end
112
+ end
113
+
114
+ def assert_no_difference(expressions, message = nil, &block)
115
+ assert_difference expressions, 0, message, &block
116
+ end
117
+
118
+ end
@@ -0,0 +1,45 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ViewedTest < ActiveSupport::TestCase
4
+
5
+ def user
6
+ user = users(:jonathan)
7
+ end
8
+
9
+ def issue
10
+ issue = issues(:first_issue)
11
+ end
12
+
13
+
14
+ def test_zero_of_view_count
15
+ assert_equal issue.view_count, "0(0)"
16
+ end
17
+
18
+ def test_can_view
19
+ issue.view '127.0.0.1', user
20
+ assert_equal issue.view_count, "1(1)"
21
+ # second view change only total count
22
+ issue.view '127.0.0.1', user
23
+ assert_equal issue.view_count, "2(1)"
24
+ end
25
+
26
+ def test_viewed_by
27
+ assert !issue.viewed_by?('127.0.0.1', user)
28
+ issue.view '127.0.0.1', user
29
+ assert issue.viewed_by?('127.0.0.1', user)
30
+ end
31
+
32
+ def test_twice_view
33
+ issue.view '127.0.0.1', user
34
+ issue.view '127.0.0.1', user
35
+ assert_equal "2(1)", issue.view_count
36
+ end
37
+
38
+ def test_viewed?
39
+ assert !issue.viewed?
40
+ issue.view '127.0.0.1', user
41
+ assert issue.viewed?
42
+ end
43
+
44
+
45
+ end