selections 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/.gitignore +18 -0
  2. data/CHANGELOG.md +3 -0
  3. data/Gemfile +4 -0
  4. data/{MIT-LICENSE → LICENSE.txt} +4 -2
  5. data/README.md +237 -0
  6. data/Rakefile +3 -29
  7. data/lib/selections.rb +22 -6
  8. data/lib/selections/belongs_to_selection.rb +20 -0
  9. data/lib/selections/form_builder_extensions.rb +86 -0
  10. data/lib/selections/selectable.rb +125 -0
  11. data/lib/selections/version.rb +1 -1
  12. data/selections.gemspec +38 -0
  13. data/spec/selections/selectable_spec.rb +220 -0
  14. data/spec/selections/selections_tag_spec.rb +203 -0
  15. data/spec/spec_helper.rb +30 -21
  16. metadata +99 -177
  17. data/README.rdoc +0 -3
  18. data/app/assets/javascripts/selections/application.js +0 -9
  19. data/app/assets/javascripts/selections/selections.js +0 -2
  20. data/app/assets/stylesheets/scaffold.css +0 -56
  21. data/app/assets/stylesheets/selections/application.css +0 -7
  22. data/app/assets/stylesheets/selections/selections.css +0 -4
  23. data/app/controllers/selections/application_controller.rb +0 -4
  24. data/app/controllers/selections/selections_controller.rb +0 -45
  25. data/app/helpers/selections/application_helper.rb +0 -4
  26. data/app/helpers/selections/selectors_helper.rb +0 -4
  27. data/app/models/selections/selection.rb +0 -83
  28. data/app/views/layouts/selections/application.html.erb +0 -1
  29. data/app/views/selections/selections/_form.html.erb +0 -41
  30. data/app/views/selections/selections/edit.html.erb +0 -6
  31. data/app/views/selections/selections/index.html.erb +0 -33
  32. data/app/views/selections/selections/new.html.erb +0 -5
  33. data/app/views/selections/selections/show.html.erb +0 -35
  34. data/config/initializers/selections.rb +0 -1
  35. data/config/routes.rb +0 -5
  36. data/db/migrate/20120114024459_create_selections_selections.rb +0 -15
  37. data/lib/selections/engine.rb +0 -5
  38. data/lib/selections/selection_select.rb +0 -24
  39. data/lib/tasks/selections_tasks.rake +0 -4
  40. data/spec/controllers/companies_controller_spec.rb +0 -10
  41. data/spec/controllers/selections/selections_controller_spec.rb +0 -165
  42. data/spec/dummy/Rakefile +0 -7
  43. data/spec/dummy/app/assets/javascripts/application.js +0 -9
  44. data/spec/dummy/app/assets/javascripts/companies.js +0 -2
  45. data/spec/dummy/app/assets/stylesheets/application.css +0 -7
  46. data/spec/dummy/app/assets/stylesheets/companies.css +0 -4
  47. data/spec/dummy/app/assets/stylesheets/scaffold.css +0 -56
  48. data/spec/dummy/app/controllers/application_controller.rb +0 -2
  49. data/spec/dummy/app/controllers/companies_controller.rb +0 -83
  50. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  51. data/spec/dummy/app/helpers/companies_helper.rb +0 -2
  52. data/spec/dummy/app/models/company.rb +0 -7
  53. data/spec/dummy/app/views/companies/_form.html.erb +0 -3
  54. data/spec/dummy/app/views/companies/edit.html.erb +0 -4
  55. data/spec/dummy/app/views/companies/index.html.erb +0 -27
  56. data/spec/dummy/app/views/companies/new.html.erb +0 -5
  57. data/spec/dummy/app/views/companies/show.html.erb +0 -20
  58. data/spec/dummy/app/views/layouts/application.html.erb +0 -11
  59. data/spec/dummy/config.ru +0 -4
  60. data/spec/dummy/config/application.rb +0 -45
  61. data/spec/dummy/config/boot.rb +0 -10
  62. data/spec/dummy/config/database.yml +0 -25
  63. data/spec/dummy/config/environment.rb +0 -5
  64. data/spec/dummy/config/environments/development.rb +0 -30
  65. data/spec/dummy/config/environments/production.rb +0 -60
  66. data/spec/dummy/config/environments/test.rb +0 -42
  67. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  68. data/spec/dummy/config/initializers/inflections.rb +0 -10
  69. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  70. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  71. data/spec/dummy/config/initializers/session_store.rb +0 -8
  72. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  73. data/spec/dummy/config/locales/en.yml +0 -5
  74. data/spec/dummy/config/routes.rb +0 -6
  75. data/spec/dummy/db/development.sqlite3 +0 -0
  76. data/spec/dummy/db/migrate/20120114125226_create_selections_selections.rb +0 -15
  77. data/spec/dummy/db/migrate/20120115055119_create_companies.rb +0 -12
  78. data/spec/dummy/db/schema.rb +0 -38
  79. data/spec/dummy/db/test.sqlite3 +0 -0
  80. data/spec/dummy/log/development.log +0 -94
  81. data/spec/dummy/log/test.log +0 -26360
  82. data/spec/dummy/public/404.html +0 -26
  83. data/spec/dummy/public/422.html +0 -26
  84. data/spec/dummy/public/500.html +0 -26
  85. data/spec/dummy/public/favicon.ico +0 -0
  86. data/spec/dummy/script/rails +0 -6
  87. data/spec/helpers/selections/selections_helper_spec.rb +0 -15
  88. data/spec/models/company_spec.rb +0 -7
  89. data/spec/models/selections/selection_spec.rb +0 -219
  90. data/spec/routing/selections/selections_routing_spec.rb +0 -35
  91. data/spec/support/controller_route_fix.rb +0 -33
  92. data/spec/support/factories/company_factory.rb +0 -5
  93. data/spec/support/factories/selection_factory.rb +0 -5
  94. data/spec/views/companies/edit.html.erb_spec.rb +0 -76
  95. data/spec/views/companies/new.html.erb_spec.rb +0 -78
  96. data/spec/views/selections/selections/edit.html.erb_spec.rb +0 -28
  97. data/spec/views/selections/selections/index.html.erb_spec.rb +0 -40
  98. data/spec/views/selections/selections/new.html.erb_spec.rb +0 -28
  99. data/spec/views/selections/selections/show.html.erb_spec.rb +0 -30
@@ -0,0 +1,125 @@
1
+ require 'acts_as_tree'
2
+
3
+ module Selections
4
+ module Selectable
5
+
6
+ module ModelMixin
7
+ extend ActiveSupport::Concern
8
+
9
+ HIDDEN_POSITION = 999888777 #:nodoc:
10
+
11
+ included do
12
+ # Setup any required model information for a selectable model.
13
+ acts_as_tree
14
+
15
+ validate :name, :existence => true
16
+ validates_presence_of :name
17
+ validates_uniqueness_of :name, :scope => :parent_id
18
+ validates_uniqueness_of :system_code, :scope => :archived_at
19
+ validates_format_of :system_code, :with => /^[a-z][a-zA-Z_0-9]*$/, :message => "can only contain alphanumeric characters and '_', not spaces"
20
+
21
+ before_validation :auto_gen_system_code, :on => :create
22
+ before_validation :disable_system_code_change, :on => :update
23
+ after_validation :check_defaults
24
+
25
+ default_scope :order => [:position_value, :name]
26
+
27
+ scope :filter_archived_except_selected, lambda { |selected_id| {:conditions => ["archived_at is ? or id = ?", nil, selected_id.to_i]} }
28
+ end
29
+
30
+ module ClassMethods
31
+ # Dynamic Lookups
32
+ #
33
+ # Assuming there is a list with the following system_codes
34
+ #
35
+ # example of a nested list of system codes:
36
+ # * priority
37
+ # * - high
38
+ # * - medium
39
+ # * - low
40
+ #
41
+ # Selection.priority => return priority instance
42
+ #
43
+ # Selection.priorities => returns [high, medium, low] instances (children)
44
+
45
+ def method_missing lookup_code, *options
46
+ if (scope = where(:system_code => lookup_code.to_s)).exists?
47
+ scope.first
48
+ elsif (scope = where(:system_code => lookup_code.to_s.singularize)).exists?
49
+ scope.first.children
50
+ else
51
+ super
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ def to_s #:nodoc:
58
+ name.to_s
59
+ end
60
+
61
+ # Returns boolean true if current node has no children
62
+ def leaf?
63
+ children.where(parent_id: self.id).empty?
64
+ end
65
+
66
+ # Returns childrens children from root or any point
67
+ def level_2
68
+ Selection.where(parent_id: child_ids)
69
+ end
70
+
71
+ def position=(value) #:nodoc:
72
+ self.position_value = value || HIDDEN_POSITION
73
+ end
74
+
75
+ def disable_system_code_change #:nodoc:
76
+ errors.add(:system_code, "cannot be changed") if system_code_changed?
77
+ end
78
+
79
+ def position #:nodoc:
80
+ position_value unless position_value == HIDDEN_POSITION
81
+ end
82
+
83
+ def auto_gen_system_code #:nodoc:
84
+ unless system_code
85
+ self.system_code= name.to_s.underscore.split(" ").join("_").singularize.underscore.gsub(/\W/, "_")
86
+ self.system_code= parent.system_code + "_" + self.system_code if parent
87
+ self.system_code.gsub!(/\_{2,}/, '_')
88
+ end
89
+ end
90
+
91
+ def check_defaults #:nodoc:
92
+ siblings_with_default_set.update_attribute(:is_default, false) if self.parent && siblings_with_default_set && self.is_default
93
+ self.is_default = false if archived
94
+ end
95
+
96
+ def siblings_with_default_set #:nodoc:
97
+ self.parent.children.where(:is_default => true).where("id != ?", self.id.to_i).first
98
+ end
99
+
100
+ def archived #:nodoc:
101
+ !!archived_at
102
+ end
103
+
104
+ def archived=(archived_checkbox) #:nodoc:
105
+ if archived_checkbox == "1"
106
+ self.archived_at = Time.now unless archived_at
107
+ else
108
+ self.archived_at = nil
109
+ end
110
+ end
111
+
112
+ def sub_children
113
+ children.flat_map(&:children)
114
+ end
115
+ end
116
+
117
+ def selectable #:nodoc:
118
+ include ModelMixin
119
+ end
120
+
121
+ ActiveSupport.on_load :active_record do
122
+ extend Selections::Selectable
123
+ end
124
+ end
125
+ end
@@ -1,3 +1,3 @@
1
1
  module Selections
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'selections/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "selections"
8
+ gem.version = Selections::VERSION
9
+ gem.authors = ["Nigel Rausch"]
10
+ gem.email = ["nigelr@brisbanerails.com"]
11
+ gem.description = %q{Selection list management and form and view helpers.
12
+ Manages one table to hold all selections items/dropdown lists ( tree ).
13
+ Dynamic lookup to find parent or children ( eg. Selection.priorities ).
14
+ Form helper to display lists ( eg. f.selections :priorities ).
15
+ Handling of archived items ( displaying if selected only ).
16
+ }
17
+ gem.summary = %q{Selection list management and form and view helpers.
18
+ Manages one table to hold all selections items/dropdown lists ( tree ).
19
+ Dynamic lookup to find parent or children ( eg. Selection.priorities ).
20
+ Form helper to display lists ( eg. f.selections :priorities ).
21
+ Handling of archived items ( displaying if selected only ).
22
+ }
23
+ gem.homepage = "https://github.com/nigelr/selections"
24
+ gem.files = `git ls-files`.split($/)
25
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
26
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
27
+ gem.require_paths = ["lib"]
28
+
29
+ gem.add_dependency 'activerecord', '~> 3.0'
30
+ gem.add_dependency 'actionpack', '~> 3.0'
31
+ gem.add_dependency 'acts_as_tree', '~> 1.2.0'
32
+
33
+ gem.add_development_dependency 'rake'
34
+ gem.add_development_dependency 'rspec'
35
+ gem.add_development_dependency 'sqlite3'
36
+ gem.add_development_dependency 'nokogiri'
37
+
38
+ end
@@ -0,0 +1,220 @@
1
+ require "spec_helper"
2
+
3
+ describe Selections do
4
+ let(:parent) { Selection.create(name: "priority") }
5
+ let(:selection_1) { Selection.create(name: "low", parent_id: parent.id) }
6
+ let(:selection_2) { Selection.create(name: "medium", parent_id: parent.id) }
7
+ let(:selection_3) { Selection.create(name: "high", parent_id: parent.id) }
8
+
9
+ describe ".filter_archived_except_selected" do
10
+ before do
11
+ selection_1
12
+ selection_2
13
+ end
14
+ it "returns all when none selected" do
15
+ parent.children.filter_archived_except_selected(nil)
16
+ expect(parent.children.filter_archived_except_selected(nil)).to match_array([selection_2, selection_1])
17
+ end
18
+ it "returns all even when selected" do
19
+ expect(parent.children.filter_archived_except_selected(selection_2.id)).to match_array([selection_2, selection_1])
20
+ end
21
+ context "archived" do
22
+ before :each do
23
+ selection_2.update_attribute(:archived, "1")
24
+ end
25
+ it "returns unarchived items" do
26
+ expect(parent.children.filter_archived_except_selected(nil)).to match_array([selection_1])
27
+ end
28
+ it "returns only unarchived items when archived is not selected" do
29
+ expect(parent.children.filter_archived_except_selected(selection_1.id)).to match_array([selection_1])
30
+ end
31
+ it "returns archived item if selected" do
32
+ expect(parent.children.filter_archived_except_selected(selection_2.id)).to match_array([selection_2, selection_1])
33
+ end
34
+ end
35
+ end
36
+
37
+ describe ".to_s" do
38
+ it "returns name" do
39
+ expect(selection_1.to_s).to eq(selection_1.name)
40
+ end
41
+ end
42
+
43
+
44
+ describe ".leaf?" do
45
+ it { selection_1; expect(parent.leaf?).to be_false }
46
+ it { expect(selection_1.leaf?).to be_true }
47
+ end
48
+
49
+ describe ".sub_children" do
50
+ before do
51
+ selection_1.children = [Selection.create(name: "sub_1"), Selection.create(name: "sub_2")]
52
+ selection_2.children = [Selection.create(name: "sub_3")]
53
+ end
54
+ it "gets all the childrens children" do
55
+ expect(parent.sub_children).to match_array(selection_1.children + selection_2.children)
56
+ end
57
+ it "return empty array from leaf" do
58
+ expect(selection_1.children.first.sub_children).to eq([])
59
+ end
60
+ end
61
+
62
+ describe ".position=" do
63
+ it "sets to HIDDEN_POSITION if blank" do
64
+ expect(Selection.create(name: "position", position: nil).position_value).to eq(Selection::HIDDEN_POSITION)
65
+ end
66
+ it "sets to position_value to 45" do
67
+ expect(Selection.create(name: "position", position: 45).position_value).to eq(45)
68
+ end
69
+ end
70
+
71
+ describe ".position" do
72
+ it "should display position if not HIDDEN_POSITION" do
73
+ expect(Selection.create(name: "position", position: 46).position).to eq(46)
74
+ end
75
+ it "should not display position if HIDDEN_POSITION" do
76
+ expect(Selection.create(name: "position", position: nil).position).to be_nil
77
+ end
78
+ end
79
+
80
+ describe ".auto_gen_system_code" do
81
+ it "only generates if blank" do
82
+ expect(Selection.create(name: "position", system_code: "hello_world").system_code).to eq("hello_world")
83
+ end
84
+
85
+ context "chaining of system_codes" do
86
+ before do
87
+ @parent = Selection.create(name: "Board Chairman")
88
+ end
89
+ it "create system_code from name" do
90
+ expect(@parent.system_code).to eq("board_chairman")
91
+ end
92
+ context "child" do
93
+ before do
94
+ @child = Selection.create(name: "CEO", parent: @parent)
95
+ end
96
+ it "create system_code from name" do
97
+ expect(@child.system_code).to eq("board_chairman_ceo")
98
+ end
99
+ context "child" do
100
+ it "create system_code from name" do
101
+ expect(Selection.create(name: "head janitor", parent: @child).system_code).to eq("board_chairman_ceo_head_janitor")
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ describe ".siblings_with_default_set" do
109
+ before do
110
+ selection_1
111
+ selection_2
112
+ selection_3
113
+ end
114
+ it "returns none when no default set" do
115
+ expect(selection_2.siblings_with_default_set).to eq(nil)
116
+ end
117
+ context "default set" do
118
+ before do
119
+ selection_2.update_attribute(:is_default, true)
120
+ end
121
+ it "returns item with default set" do
122
+ expect(selection_1.siblings_with_default_set).to eq(selection_2)
123
+ end
124
+ it "does not returns item with default set when self" do
125
+ expect(selection_2.siblings_with_default_set).to eq(nil)
126
+ end
127
+ end
128
+ end
129
+
130
+ describe ".check_defaults" do
131
+ before do
132
+ selection_1
133
+ selection_2
134
+ selection_3
135
+ end
136
+ it("selection_1 should not be set") { expect(selection_1.reload.is_default).to be_false }
137
+ it("selection_2 should not be set") { expect(selection_2.reload.is_default).to be_false }
138
+ it("selection_3 should not be set") { expect(selection_3.reload.is_default).to be_false }
139
+
140
+ context "setting one item to default" do
141
+ before { selection_2.update_attributes(is_default: true) }
142
+ it("should set self as default") { expect(selection_2.reload.is_default).to be_true }
143
+ it("selection_1 should not be set") { expect(selection_1.reload.is_default).to be_false }
144
+ it("selection_3 should not be set") { expect(selection_3.reload.is_default).to be_false }
145
+ context "setting same item to default" do
146
+ before { selection_2.update_attributes(is_default: true) }
147
+ it("should set self as default") { expect(selection_2.reload.is_default).to be_true }
148
+ it("selection_1 should not be set") { expect(selection_1.reload.is_default).to be_false }
149
+ it("selection_3 should not be set") { expect(selection_3.reload.is_default).to be_false }
150
+ end
151
+ context "setting other item to default" do
152
+ before { selection_1.update_attributes(is_default: true) }
153
+ it("should set self as default") { expect(selection_1.reload.is_default).to be_true }
154
+ it("selection_2 should not be set") { expect(selection_2.reload.is_default).to be_false }
155
+ it("selection_3 should not be set") { expect(selection_3.reload.is_default).to be_false }
156
+ end
157
+ context "removing default setting" do
158
+ before { selection_2.update_attributes(is_default: false) }
159
+ it("should unset self as default") { expect(selection_1.reload.is_default).to be_false }
160
+ it("selection_2 should not be set") { expect(selection_2.reload.is_default).to be_false }
161
+ it("selection_3 should not be set") { expect(selection_3.reload.is_default).to be_false }
162
+ end
163
+ context "archive item with default" do
164
+ before { selection_2.update_attributes(archived: "1") }
165
+ it("should unset self as default") { expect(selection_2.reload.is_default).to be_false }
166
+ it("selection_1 should not be set") { expect(selection_1.reload.is_default).to be_false }
167
+ it("selection_3 should not be set") { expect(selection_3.reload.is_default).to be_false }
168
+ end
169
+ end
170
+ end
171
+
172
+ describe ".archived=" do
173
+ before do
174
+ @stubbed_time = Time.parse("01/01/2010 10:00")
175
+ Time.stub(:now).and_return(@stubbed_time)
176
+ selection_1.update_attributes(archived: "1")
177
+ end
178
+
179
+ it "should set archived" do
180
+ expect(selection_1.archived_at).to eq @stubbed_time
181
+ end
182
+ it "remain archived and not change date when set again" do
183
+ Time.stub(:now).and_return(Time.parse("12/12/2012 10:00"))
184
+ selection_1.update_attributes(archived: "1")
185
+ expect(selection_1.archived_at).to eq @stubbed_time
186
+ end
187
+ it "un-archives item" do
188
+ selection_1.update_attributes(archived: "0")
189
+ expect(selection_1.archived_at).to be_nil
190
+ end
191
+ end
192
+
193
+ describe ".archived" do
194
+ it "when archived set" do
195
+ selection_1.update_attributes(archived: "1")
196
+ expect(selection_1.archived).to be_true
197
+ end
198
+ it "when archived set" do
199
+ selection_1.update_attributes(archived: "0")
200
+ expect(selection_1.archived).to be_false
201
+ end
202
+ end
203
+
204
+ context "selecting" do
205
+ before do
206
+ selection_1
207
+ selection_2
208
+ end
209
+ it "singular" do
210
+ expect(Selection.send(parent.system_code)).to eq(parent)
211
+ end
212
+ it "plural" do
213
+ expect(Selection.send(parent.system_code.pluralize)).to eq(parent.children)
214
+ end
215
+ #TODO this needs to ne an option
216
+ #it "should not error when non existent" do
217
+ # expect(Selection.non_existent_system_code).to eq([])
218
+ #end
219
+ end
220
+ end
@@ -0,0 +1,203 @@
1
+ require "spec_helper"
2
+
3
+
4
+ include Selections::FormBuilderExtensions
5
+ describe SelectionTag do
6
+ let(:parent) { Selection.create(name: "priority") }
7
+ let(:model_parent) { Selection.create(name: "ticket_priority") }
8
+ let(:selection_1) { Selection.create(name: "low", parent_id: parent.id) }
9
+ let(:selection_2) { Selection.create(name: "medium", parent_id: parent.id) }
10
+ let(:selection_3) { Selection.create(name: "high", parent_id: parent.id) }
11
+ let(:form) { ActionView::Helpers::FormBuilder.new(:ticket, ticket, ActionView::Base.new, {}, Proc.new {}) }
12
+ let(:ticket) { Ticket.create(:name => "railscamp") }
13
+ let(:all_selections) do
14
+ parent
15
+ selection_1
16
+ selection_2
17
+ selection_3
18
+ end
19
+
20
+
21
+ describe ".system_code" do
22
+ context "direct parent" do
23
+ before { parent }
24
+ it "returns priority selection item" do
25
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).system_code).to eq(parent)
26
+ end
27
+ it "does not find" do
28
+ expect(SelectionTag.new(form, ticket, :non_existent, {}, {}).system_code).to be_nil
29
+ end
30
+ end
31
+
32
+ it "finds with form model prefixed" do
33
+ model_parent
34
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).system_code).to eq(model_parent)
35
+ end
36
+ end
37
+
38
+ describe ".items" do
39
+ before { all_selections }
40
+
41
+ it "returns all children items" do
42
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).items.all).to eq(parent.children)
43
+ end
44
+ context "archived" do
45
+ before { selection_2.update_attribute(:archived, "1") }
46
+ it "returns only non archived items" do
47
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).items).to eq(parent.children - [selection_2])
48
+ end
49
+ it "returns archived items when selected" do
50
+ ticket.update_attribute(:priority_id, selection_2.id)
51
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).items.all).to eq(parent.children)
52
+ end
53
+ end
54
+ end
55
+
56
+ describe ".field_id" do
57
+ it("when string") { expect(SelectionTag.new(nil, nil, "priority", {}, {}).field_id).to eq(:priority_id) }
58
+ it("when symbol") { expect(SelectionTag.new(nil, nil, :priority, {}, {}).field_id).to eq(:priority_id) }
59
+ end
60
+
61
+ describe ".system_code_name" do
62
+ it("sets to field name") { expect(SelectionTag.new(nil, nil, :priority, {}, {}).system_code_name).to eq(:priority) }
63
+ it("when override system_code") { expect(SelectionTag.new(nil, nil, :hello, {}, {system_code: :priority}).system_code_name).to eq(:priority) }
64
+ end
65
+
66
+ context "include blank" do
67
+ before { all_selections }
68
+
69
+ context "when not set" do
70
+ context "new form" do
71
+ it("has blank") { expect(SelectionTag.new(form, Ticket.new, :priority, {}, {}).include_blank?).to be_true }
72
+ it "has no blank when default set" do
73
+ selection_1.update_attribute(:is_default, true)
74
+ expect(SelectionTag.new(form, Ticket.new, :priority, {}, {}).include_blank?).to be_false
75
+ end
76
+ end
77
+ context "edit form" do
78
+ it("has no blank when ticket.priority_id is set") do
79
+ ticket.update_attribute(:priority_id, selection_3.id)
80
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).include_blank?).to be_false
81
+ end
82
+ it("has blank when ticket.priority_id is nil") { expect(SelectionTag.new(form, ticket, :priority, {}, {}).include_blank?).to be_true }
83
+ it "has no blank when ticket.priority_id is nil and default set" do
84
+ selection_1.update_attribute(:is_default, true)
85
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).include_blank?).to be_false
86
+ end
87
+ end
88
+ end
89
+
90
+ context "when set false" do
91
+ context "new form" do
92
+ it("has no blank") { expect(SelectionTag.new(form, Ticket.new, :priority, {}, {include_blank: false}).include_blank?).to be_false }
93
+ it "has no blank when default set" do
94
+ selection_1.update_attribute(:is_default, true)
95
+ expect(SelectionTag.new(form, Ticket.new, :priority, {}, {include_blank: false}).include_blank?).to be_false
96
+ end
97
+ end
98
+ context "edit form" do
99
+ it("has no blank when ticket.priority_id is set") do
100
+ ticket.update_attribute(:priority_id, selection_3.id)
101
+ expect(SelectionTag.new(form, ticket, :priority, {}, {include_blank: false}).include_blank?).to be_false
102
+ end
103
+ it("has no blank even when ticket.priority_id is nil") { expect(SelectionTag.new(form, ticket, :priority, {}, {include_blank: false}).include_blank?).to be_false }
104
+ it "has no blank when ticket.priority_id is nil and default set" do
105
+ selection_1.update_attribute(:is_default, true)
106
+ expect(SelectionTag.new(form, ticket, :priority, {}, {include_blank: false}).include_blank?).to be_false
107
+ end
108
+ end
109
+ end
110
+
111
+ context "when set to true" do
112
+ context "new form" do
113
+ it("has blank") { expect(SelectionTag.new(form, Ticket.new, :priority, {}, {include_blank: true}).include_blank?).to be_true }
114
+ it "has blank even when default set" do
115
+ selection_1.update_attribute(:is_default, true)
116
+ expect(SelectionTag.new(form, Ticket.new, :priority, {}, {include_blank: true}).include_blank?).to be_true
117
+ end
118
+ end
119
+ context "edit form" do
120
+ it("has blank even when ticket.priority_id is set") do
121
+ ticket.update_attribute(:priority_id, selection_3.id)
122
+ expect(SelectionTag.new(form, ticket, :priority, {}, {include_blank: true}).include_blank?).to be_true
123
+ end
124
+ it("has blank even when ticket.priority_id is nil") { expect(SelectionTag.new(form, ticket, :priority, {}, {include_blank: true}).include_blank?).to be_true }
125
+ it "has blank even when ticket.priority_id is nil and default set" do
126
+ selection_1.update_attribute(:is_default, true)
127
+ expect(SelectionTag.new(form, ticket, :priority, {}, {include_blank: true}).include_blank?).to be_true
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ context ".default_item" do
134
+ before { all_selections }
135
+ it "returns nil when no default set" do
136
+ expect(SelectionTag.new(form, Ticket.new, :priority, {}, {include_blank: false}).default_item).to be_blank
137
+ end
138
+ it "should set to default item" do
139
+ selection_2.update_attribute(:is_default, true)
140
+ expect(SelectionTag.new(form, Ticket.new, :priority, {}, {include_blank: false}).default_item).to eq(selection_2.id.to_s)
141
+ end
142
+ end
143
+
144
+ context ".selected_item" do
145
+ before { all_selections }
146
+
147
+ context "when default not set" do
148
+ it("when new form") { expect(SelectionTag.new(form, Ticket.new, :priority, {}, {}).selected_item).to eq("") }
149
+ it "when edit form with ticket.priority_id set" do
150
+ ticket.update_attribute(:priority_id, selection_3.id)
151
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).selected_item).to eq(selection_3.id.to_s)
152
+ end
153
+ it("when edit form with no ticket.priority_id set") { expect(SelectionTag.new(form, ticket, :priority, {}, {}).selected_item).to eq("") }
154
+ end
155
+ context "when default is set" do
156
+ before { selection_2.update_attribute(:is_default, true) }
157
+ it("when new form") { expect(SelectionTag.new(form, Ticket.new, :priority, {}, {}).selected_item).to eq(selection_2.id.to_s) }
158
+ it "when edit form with ticket.priority_id set" do
159
+ ticket.update_attribute(:priority_id, selection_3.id)
160
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).selected_item).to eq(selection_3.id.to_s)
161
+ end
162
+ it("when edit form with no ticket.priority_id set") { expect(SelectionTag.new(form, ticket, :priority, {}, {}).selected_item).to eq("") }
163
+ end
164
+ end
165
+
166
+ describe ".to_tag" do
167
+ it "displays warning when system_code does not exist" do
168
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).to_tag).to eq("Invalid system_code of 'priority'")
169
+ end
170
+ context "valid system_code" do
171
+ before { all_selections }
172
+
173
+ context "new form" do
174
+ context "no default" do
175
+ it("has no selected item") { expect(Nokogiri::HTML(SelectionTag.new(form, Ticket.new, :priority, {}, {}).to_tag).search("option[selected]")).to be_empty }
176
+ it("has a blank option") { expect(Nokogiri::HTML(SelectionTag.new(form, Ticket.new, :priority, {}, {}).to_tag).search("option[value='']").count).to eq(1) }
177
+ end
178
+ context "default is set" do
179
+ before { selection_3.update_attribute(:is_default, true) }
180
+
181
+ it("has selection_3 selected") { expect(Nokogiri::HTML(SelectionTag.new(form, Ticket.new, :priority, {}, {}).to_tag).search("option[selected]").first.content).to eq(selection_3.name) }
182
+ it("has no blank option") { expect(Nokogiri::HTML(SelectionTag.new(form, Ticket.new, :priority, {}, {}).to_tag).search("option[value='']").count).to eq(0) }
183
+ end
184
+ end
185
+
186
+ context "edit form" do
187
+ context "relation (priority_id) is nil" do
188
+ it("has no selected item") { expect(Nokogiri::HTML(SelectionTag.new(form, ticket, :priority, {}, {}).to_tag).search("option[selected]")).to be_empty }
189
+ it("has a blank option") { expect(Nokogiri::HTML(SelectionTag.new(form, ticket, :priority, {}, {}).to_tag).search("option[value='']").count).to eq(1) }
190
+ end
191
+ context "when relation (priority_id) is set to selection_3" do
192
+ before { ticket.update_attribute(:priority_id, selection_3.id) }
193
+
194
+ it("item is selected") { expect(Nokogiri::HTML(SelectionTag.new(form, ticket, :priority, {}, {}).to_tag).search("option[selected]").first.content).to eq(selection_3.name) }
195
+ it("has no blank option") { expect(Nokogiri::HTML(SelectionTag.new(form, ticket, :priority, {}, {}).to_tag).search("option[value='']").count).to eq(0) }
196
+ end
197
+ end
198
+ it "returns valid html" do
199
+ expect(SelectionTag.new(form, ticket, :priority, {}, {}).to_tag).to eq "<select id=\"ticket_priority_id\" name=\"ticket[priority_id]\"><option value=\"\"></option>\n<option value=\"4\">high</option>\n<option value=\"2\">low</option>\n<option value=\"3\">medium</option></select>"
200
+ end
201
+ end
202
+ end
203
+ end