fat_free_crm 0.17.1 → 0.18.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fat_free_crm might be problematic. Click here for more details.

Files changed (199) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +1 -1
  3. data/.rubocop_todo.yml +32 -11
  4. data/.travis.yml +14 -9
  5. data/CHANGELOG.md +75 -0
  6. data/CONTRIBUTORS.md +95 -53
  7. data/Gemfile +11 -7
  8. data/Gemfile.lock +97 -97
  9. data/README.md +7 -4
  10. data/app/assets/javascripts/crm.js.coffee +3 -3
  11. data/app/assets/javascripts/crm_select2.js.coffee +16 -4
  12. data/app/controllers/admin/application_controller.rb +1 -1
  13. data/app/controllers/admin/field_groups_controller.rb +8 -1
  14. data/app/controllers/admin/fields_controller.rb +9 -6
  15. data/app/controllers/admin/groups_controller.rb +1 -1
  16. data/app/controllers/admin/plugins_controller.rb +7 -1
  17. data/app/controllers/admin/settings_controller.rb +5 -1
  18. data/app/controllers/admin/tags_controller.rb +6 -2
  19. data/app/controllers/application_controller.rb +21 -4
  20. data/app/controllers/authentications_controller.rb +1 -1
  21. data/app/controllers/comments_controller.rb +15 -7
  22. data/app/controllers/entities/campaigns_controller.rb +7 -2
  23. data/app/controllers/entities/leads_controller.rb +9 -2
  24. data/app/controllers/entities/opportunities_controller.rb +13 -2
  25. data/app/controllers/entities_controller.rb +10 -5
  26. data/app/controllers/lists_controller.rb +5 -1
  27. data/app/controllers/tasks_controller.rb +15 -1
  28. data/app/helpers/accounts_helper.rb +7 -5
  29. data/app/helpers/application_helper.rb +2 -2
  30. data/app/helpers/leads_helper.rb +1 -1
  31. data/app/helpers/opportunities_helper.rb +56 -3
  32. data/app/helpers/tags_helper.rb +1 -1
  33. data/app/models/entities/lead.rb +0 -7
  34. data/app/models/entities/opportunity.rb +3 -2
  35. data/app/models/observers/opportunity_observer.rb +4 -4
  36. data/app/models/users/ability.rb +3 -4
  37. data/app/views/campaigns/_metrics.html.haml +3 -3
  38. data/app/views/home/_opportunity.html.haml +4 -19
  39. data/app/views/opportunities/_index_long.html.haml +1 -24
  40. data/app/views/opportunities/_sidebar_show.html.haml +3 -3
  41. data/app/views/opportunities/_top_section.html.haml +1 -1
  42. data/config/initializers/ransack.rb +1 -1
  43. data/db/schema.rb +0 -3
  44. data/fat_free_crm.gemspec +1 -1
  45. data/lib/fat_free_crm/core_ext/string.rb +1 -1
  46. data/lib/fat_free_crm/engine.rb +2 -2
  47. data/lib/fat_free_crm/fields.rb +1 -1
  48. data/lib/fat_free_crm/permissions.rb +0 -14
  49. data/lib/fat_free_crm/version.rb +2 -2
  50. data/lib/tasks/ffcrm/setup.rake +4 -4
  51. data/spec/controllers/admin/users_controller_spec.rb +27 -27
  52. data/spec/controllers/authentications_controller_spec.rb +7 -7
  53. data/spec/controllers/comments_controller_spec.rb +13 -13
  54. data/spec/controllers/emails_controller_spec.rb +2 -2
  55. data/spec/controllers/entities/accounts_controller_spec.rb +56 -56
  56. data/spec/controllers/entities/campaigns_controller_spec.rb +66 -66
  57. data/spec/controllers/entities/contacts_controller_spec.rb +67 -67
  58. data/spec/controllers/entities/leads_controller_spec.rb +125 -125
  59. data/spec/controllers/entities/opportunities_controller_spec.rb +100 -100
  60. data/spec/controllers/home_controller_spec.rb +26 -26
  61. data/spec/controllers/passwords_controller_spec.rb +1 -1
  62. data/spec/controllers/tasks_controller_spec.rb +37 -37
  63. data/spec/controllers/users_controller_spec.rb +18 -18
  64. data/spec/factories/account_factories.rb +8 -8
  65. data/spec/factories/campaign_factories.rb +5 -5
  66. data/spec/factories/contact_factories.rb +10 -10
  67. data/spec/factories/field_factories.rb +7 -7
  68. data/spec/factories/lead_factories.rb +8 -8
  69. data/spec/factories/list_factories.rb +1 -1
  70. data/spec/factories/opportunity_factories.rb +6 -6
  71. data/spec/factories/sequences.rb +1 -1
  72. data/spec/factories/setting_factories.rb +3 -3
  73. data/spec/factories/shared_factories.rb +14 -14
  74. data/spec/factories/subscription_factories.rb +1 -1
  75. data/spec/factories/tag_factories.rb +1 -1
  76. data/spec/factories/task_factories.rb +4 -4
  77. data/spec/factories/user_factories.rb +13 -13
  78. data/spec/features/accounts_spec.rb +17 -4
  79. data/spec/features/admin/groups_spec.rb +1 -1
  80. data/spec/features/admin/users_spec.rb +1 -1
  81. data/spec/features/campaigns_spec.rb +4 -4
  82. data/spec/features/contacts_spec.rb +10 -4
  83. data/spec/features/dashboard_spec.rb +7 -7
  84. data/spec/features/leads_spec.rb +4 -4
  85. data/spec/features/opportunities_overview_spec.rb +15 -15
  86. data/spec/features/opportunities_spec.rb +34 -8
  87. data/spec/features/support/autocomlete_helper.rb +17 -0
  88. data/spec/features/support/browser.rb +3 -8
  89. data/spec/features/support/helpers.rb +1 -1
  90. data/spec/features/tasks_spec.rb +4 -4
  91. data/spec/helpers/admin/field_groups_helper_spec.rb +1 -1
  92. data/spec/helpers/application_helper_spec.rb +1 -1
  93. data/spec/helpers/tasks_helper_spec.rb +1 -1
  94. data/spec/helpers/users_helper_spec.rb +3 -3
  95. data/spec/lib/comment_extensions_spec.rb +1 -1
  96. data/spec/lib/mail_processor/base_spec.rb +3 -3
  97. data/spec/lib/mail_processor/comment_replies_spec.rb +3 -3
  98. data/spec/lib/mail_processor/dropbox_spec.rb +16 -16
  99. data/spec/lib/permissions_spec.rb +7 -25
  100. data/spec/mailers/user_mailer_spec.rb +7 -7
  101. data/spec/models/entities/account_spec.rb +31 -32
  102. data/spec/models/entities/campaign_spec.rb +18 -25
  103. data/spec/models/entities/contact_spec.rb +18 -21
  104. data/spec/models/entities/lead_spec.rb +9 -11
  105. data/spec/models/entities/opportunity_spec.rb +45 -45
  106. data/spec/models/fields/custom_field_spec.rb +17 -17
  107. data/spec/models/list_spec.rb +2 -2
  108. data/spec/models/observers/entity_observer_spec.rb +6 -6
  109. data/spec/models/polymorphic/address_spec.rb +1 -1
  110. data/spec/models/polymorphic/avatar_spec.rb +5 -5
  111. data/spec/models/polymorphic/comment_spec.rb +5 -5
  112. data/spec/models/polymorphic/task_spec.rb +65 -58
  113. data/spec/models/polymorphic/version_spec.rb +26 -26
  114. data/spec/models/setting_spec.rb +2 -2
  115. data/spec/models/users/preference_spec.rb +6 -6
  116. data/spec/models/users/user_spec.rb +26 -26
  117. data/spec/shared/controllers.rb +3 -3
  118. data/spec/shared/models.rb +22 -22
  119. data/spec/spec_helper.rb +2 -2
  120. data/spec/support/auth_macros.rb +1 -1
  121. data/spec/support/macros.rb +3 -3
  122. data/spec/views/accounts/_edit.haml_spec.rb +1 -1
  123. data/spec/views/accounts/create.js.haml_spec.rb +2 -2
  124. data/spec/views/accounts/destroy.js.haml_spec.rb +1 -1
  125. data/spec/views/accounts/edit.js.haml_spec.rb +2 -2
  126. data/spec/views/accounts/index.haml_spec.rb +2 -2
  127. data/spec/views/accounts/index.js.haml_spec.rb +1 -1
  128. data/spec/views/accounts/show.haml_spec.rb +4 -4
  129. data/spec/views/accounts/update.js.haml_spec.rb +1 -1
  130. data/spec/views/admin/field_groups/create.js.haml_spec.rb +1 -1
  131. data/spec/views/admin/field_groups/destroy.js.haml_spec.rb +1 -1
  132. data/spec/views/admin/field_groups/edit.js.haml_spec.rb +1 -1
  133. data/spec/views/admin/field_groups/new.js.haml_spec.rb +1 -1
  134. data/spec/views/admin/field_groups/update.js.haml_spec.rb +1 -1
  135. data/spec/views/admin/users/create.js.haml_spec.rb +2 -2
  136. data/spec/views/admin/users/destroy.js.haml_spec.rb +2 -2
  137. data/spec/views/admin/users/edit.js.haml_spec.rb +2 -2
  138. data/spec/views/admin/users/index.haml_spec.rb +1 -1
  139. data/spec/views/admin/users/index.js.haml_spec.rb +2 -2
  140. data/spec/views/admin/users/reactivate.js.haml_spec.rb +1 -1
  141. data/spec/views/admin/users/suspend.js.haml_spec.rb +1 -1
  142. data/spec/views/admin/users/update.js.haml_spec.rb +1 -1
  143. data/spec/views/application/auto_complete.haml_spec.rb +3 -3
  144. data/spec/views/campaigns/_edit.haml_spec.rb +1 -1
  145. data/spec/views/campaigns/create.js.haml_spec.rb +3 -3
  146. data/spec/views/campaigns/destroy.js.haml_spec.rb +1 -1
  147. data/spec/views/campaigns/edit.js.haml_spec.rb +2 -2
  148. data/spec/views/campaigns/index.haml_spec.rb +1 -1
  149. data/spec/views/campaigns/index.js.haml_spec.rb +1 -1
  150. data/spec/views/campaigns/show.haml_spec.rb +4 -4
  151. data/spec/views/campaigns/update.js.haml_spec.rb +1 -1
  152. data/spec/views/contacts/_edit.haml_spec.rb +7 -7
  153. data/spec/views/contacts/_new.haml_spec.rb +1 -1
  154. data/spec/views/contacts/create.js.haml_spec.rb +4 -4
  155. data/spec/views/contacts/destroy.js.haml_spec.rb +1 -1
  156. data/spec/views/contacts/edit.js.haml_spec.rb +3 -3
  157. data/spec/views/contacts/index.haml_spec.rb +1 -1
  158. data/spec/views/contacts/index.js.html_spec.rb +1 -1
  159. data/spec/views/contacts/new.js.haml_spec.rb +1 -1
  160. data/spec/views/contacts/show.haml_spec.rb +3 -3
  161. data/spec/views/contacts/update.js.haml_spec.rb +2 -2
  162. data/spec/views/home/index.haml_spec.rb +1 -1
  163. data/spec/views/home/index.js.haml_spec.rb +1 -1
  164. data/spec/views/home/options.js.haml_spec.rb +2 -2
  165. data/spec/views/leads/_convert.haml_spec.rb +3 -3
  166. data/spec/views/leads/_edit.haml_spec.rb +2 -2
  167. data/spec/views/leads/_new.haml_spec.rb +2 -2
  168. data/spec/views/leads/_sidebar_show.haml_spec.rb +5 -5
  169. data/spec/views/leads/convert.js.haml_spec.rb +4 -4
  170. data/spec/views/leads/create.js.haml_spec.rb +5 -5
  171. data/spec/views/leads/destroy.js.haml_spec.rb +2 -2
  172. data/spec/views/leads/edit.js.haml_spec.rb +4 -4
  173. data/spec/views/leads/index.haml_spec.rb +1 -1
  174. data/spec/views/leads/index.js.haml_spec.rb +1 -1
  175. data/spec/views/leads/new.js.haml_spec.rb +1 -1
  176. data/spec/views/leads/promote.js.haml_spec.rb +7 -7
  177. data/spec/views/leads/reject.js.haml_spec.rb +2 -2
  178. data/spec/views/leads/show.haml_spec.rb +2 -2
  179. data/spec/views/leads/update.js.haml_spec.rb +4 -4
  180. data/spec/views/opportunities/_edit.haml_spec.rb +7 -7
  181. data/spec/views/opportunities/_new.haml_spec.rb +2 -2
  182. data/spec/views/opportunities/create.js.haml_spec.rb +6 -6
  183. data/spec/views/opportunities/destroy.js.haml_spec.rb +3 -3
  184. data/spec/views/opportunities/edit.js.haml_spec.rb +3 -3
  185. data/spec/views/opportunities/index.haml_spec.rb +1 -1
  186. data/spec/views/opportunities/index.js.haml_spec.rb +1 -1
  187. data/spec/views/opportunities/new.js.haml_spec.rb +1 -1
  188. data/spec/views/opportunities/show.haml_spec.rb +3 -3
  189. data/spec/views/opportunities/update.js.haml_spec.rb +4 -4
  190. data/spec/views/tasks/_edit.haml_spec.rb +1 -1
  191. data/spec/views/tasks/complete.js.haml_spec.rb +4 -4
  192. data/spec/views/tasks/create.js.haml_spec.rb +6 -6
  193. data/spec/views/tasks/destroy.js.haml_spec.rb +2 -2
  194. data/spec/views/tasks/index.haml_spec.rb +4 -4
  195. data/spec/views/tasks/new.js.haml_spec.rb +1 -1
  196. data/spec/views/tasks/uncomplete.js.haml_spec.rb +2 -2
  197. data/spec/views/tasks/update.js.haml_spec.rb +18 -18
  198. data/spec/views/users/upload_avatar.js.haml_spec.rb +2 -2
  199. metadata +5 -4
@@ -35,16 +35,16 @@ describe CustomField do
35
35
  expect(Contact).to receive(:reset_column_information)
36
36
  expect(Contact).to receive(:serialize_custom_fields!)
37
37
 
38
- FactoryGirl.create(:custom_field,
39
- as: "string",
40
- name: "cf_test_field",
41
- label: "Test Field",
42
- field_group: FactoryGirl.create(:field_group, klass_name: "Contact"))
38
+ create(:custom_field,
39
+ as: "string",
40
+ name: "cf_test_field",
41
+ label: "Test Field",
42
+ field_group: create(:field_group, klass_name: "Contact"))
43
43
  end
44
44
 
45
45
  it "should generate a unique column name for a custom field" do
46
- field_group = FactoryGirl.build(:field_group, klass_name: "Contact")
47
- c = FactoryGirl.build(:custom_field, label: "Test Field", field_group: field_group)
46
+ field_group = build(:field_group, klass_name: "Contact")
47
+ c = build(:custom_field, label: "Test Field", field_group: field_group)
48
48
 
49
49
  columns = []
50
50
  %w[cf_test_field cf_test_field_2 cf_test_field_3 cf_test_field_4].each do |field|
@@ -54,12 +54,12 @@ describe CustomField do
54
54
  end
55
55
 
56
56
  it "should evaluate the safety of database transitions" do
57
- c = FactoryGirl.build(:custom_field, as: "string")
57
+ c = build(:custom_field, as: "string")
58
58
  expect(c.send(:db_transition_safety, c.as, "email")).to eq(:null)
59
59
  expect(c.send(:db_transition_safety, c.as, "text")).to eq(:safe)
60
60
  expect(c.send(:db_transition_safety, c.as, "datetime")).to eq(:unsafe)
61
61
 
62
- c = FactoryGirl.build(:custom_field, as: "datetime")
62
+ c = build(:custom_field, as: "datetime")
63
63
  expect(c.send(:db_transition_safety, c.as, "date")).to eq(:safe)
64
64
  expect(c.send(:db_transition_safety, c.as, "url")).to eq(:unsafe)
65
65
  end
@@ -67,7 +67,7 @@ describe CustomField do
67
67
  it "should return a safe list of types for the 'as' select options" do
68
68
  { "email" => %w[check_boxes text string email url tel select radio_buttons],
69
69
  "integer" => %w[integer float] }.each do |type, expected_arr|
70
- c = FactoryGirl.build(:custom_field, as: type)
70
+ c = build(:custom_field, as: type)
71
71
  opts = c.available_as
72
72
  expect(opts.map(&:first)).to match_array(expected_arr)
73
73
  end
@@ -81,12 +81,12 @@ describe CustomField do
81
81
  expect(Contact).to receive(:reset_column_information).twice
82
82
  expect(Contact).to receive(:serialize_custom_fields!).twice
83
83
 
84
- field_group = FactoryGirl.create(:field_group, klass_name: "Contact")
85
- c = FactoryGirl.create(:custom_field,
86
- label: "Test Field",
87
- name: nil,
88
- as: "email",
89
- field_group: field_group)
84
+ field_group = create(:field_group, klass_name: "Contact")
85
+ c = create(:custom_field,
86
+ label: "Test Field",
87
+ name: nil,
88
+ as: "email",
89
+ field_group: field_group)
90
90
  c.as = "text"
91
91
  c.save
92
92
  end
@@ -102,7 +102,7 @@ describe CustomField do
102
102
  expect(Contact).to receive(:reset_column_information)
103
103
  expect(Contact).to receive(:serialize_custom_fields!)
104
104
 
105
- contact = FactoryGirl.build(:contact)
105
+ contact = build(:contact)
106
106
  expect(contact.cf_another_new_field).to eq(nil)
107
107
  end
108
108
  end
@@ -10,10 +10,10 @@ require 'spec_helper'
10
10
  describe List do
11
11
  it "should parse the controller from the url" do
12
12
  ["/controller/action", "controller/action?utf8=%E2%9C%93"].each do |url|
13
- list = FactoryGirl.build(:list, url: url)
13
+ list = build(:list, url: url)
14
14
  expect(list.controller).to eq("controller")
15
15
  end
16
- list = FactoryGirl.build(:list, url: nil)
16
+ list = build(:list, url: nil)
17
17
  expect(list.controller).to eq(nil)
18
18
  end
19
19
  end
@@ -15,9 +15,9 @@ describe EntityObserver do
15
15
 
16
16
  %i[account contact lead opportunity].each do |entity_type|
17
17
  describe "on creation of #{entity_type}" do
18
- let(:assignee) { FactoryGirl.create(:user) }
19
- let(:assigner) { FactoryGirl.create(:user) }
20
- let!(:entity) { FactoryGirl.build(entity_type, user: assigner, assignee: assignee) }
18
+ let(:assignee) { create(:user) }
19
+ let(:assigner) { create(:user) }
20
+ let!(:entity) { build(entity_type, user: assigner, assignee: assignee) }
21
21
  let(:mail) { double('mail', deliver_now: true) }
22
22
 
23
23
  after :each do
@@ -45,9 +45,9 @@ describe EntityObserver do
45
45
  end
46
46
 
47
47
  describe "on update of #{entity_type}" do
48
- let(:assignee) { FactoryGirl.create(:user) }
49
- let(:assigner) { FactoryGirl.create(:user) }
50
- let!(:entity) { FactoryGirl.create(entity_type, user: FactoryGirl.create(:user)) }
48
+ let(:assignee) { create(:user) }
49
+ let(:assigner) { create(:user) }
50
+ let!(:entity) { create(entity_type, user: create(:user)) }
51
51
  let(:mail) { double('mail', deliver_now: true) }
52
52
 
53
53
  it "notifies the new owner if the entity is re-assigned" do
@@ -29,6 +29,6 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
29
29
 
30
30
  describe Address do
31
31
  it "should create a new instance given valid attributes" do
32
- Address.create!(street1: "street1", street2: "street2", city: "city", state: "state", zipcode: "zipcode", country: "country", full_address: "fa", address_type: "Lead", addressable: FactoryGirl.create(:lead))
32
+ Address.create!(street1: "street1", street2: "street2", city: "city", state: "state", zipcode: "zipcode", country: "country", full_address: "fa", address_type: "Lead", addressable: create(:lead))
33
33
  end
34
34
  end
@@ -24,22 +24,22 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
24
24
 
25
25
  describe Avatar do
26
26
  before(:each) do
27
- @user = FactoryGirl.create(:user)
27
+ @user = create(:user)
28
28
  end
29
29
 
30
30
  it "should create a new instance given valid attributes" do
31
- expect(FactoryGirl.create(:avatar, entity: @user)).to be_valid
31
+ expect(create(:avatar, entity: @user)).to be_valid
32
32
  end
33
33
 
34
34
  it "user should have one avatar as entity" do
35
- avatar = FactoryGirl.create(:avatar, entity: @user)
35
+ avatar = create(:avatar, entity: @user)
36
36
  expect(@user.avatar).to eq(avatar)
37
37
  end
38
38
 
39
39
  it "user might have many avatars as owner" do
40
40
  avatars = [
41
- FactoryGirl.create(:avatar, user: @user, entity: FactoryGirl.create(:user)),
42
- FactoryGirl.create(:avatar, user: @user, entity: FactoryGirl.create(:user))
41
+ create(:avatar, user: @user, entity: create(:user)),
42
+ create(:avatar, user: @user, entity: create(:user))
43
43
  ]
44
44
  expect(@user.avatars).to eq(avatars)
45
45
  end
@@ -25,17 +25,17 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
25
25
 
26
26
  describe Comment do
27
27
  it "should create a new instance given valid attributes" do
28
- Comment.create!(comment: "Hello", user: FactoryGirl.create(:user), commentable: FactoryGirl.create(:lead))
28
+ Comment.create!(comment: "Hello", user: create(:user), commentable: create(:lead))
29
29
  end
30
30
 
31
31
  it "should subscribe users mentioned in the comment to the entity, and notify them via email" do
32
32
  expected_users = [
33
- FactoryGirl.create(:user, username: "test_user"),
34
- FactoryGirl.create(:user, username: "another_user")
33
+ create(:user, username: "test_user"),
34
+ create(:user, username: "another_user")
35
35
  ]
36
- entity = FactoryGirl.create(:lead)
36
+ entity = create(:lead)
37
37
  Comment.create!(comment: "Hey @test_user, take a look at this. Also show @another_user",
38
- user: FactoryGirl.create(:user),
38
+ user: create(:user),
39
39
  commentable: entity)
40
40
 
41
41
  expected_users.each do |user|
@@ -32,11 +32,9 @@
32
32
  require 'spec_helper'
33
33
 
34
34
  describe Task do
35
- let(:current_user) { FactoryGirl.create(:user) }
36
-
37
35
  describe "Task/Create" do
38
36
  it "should create a new task instance given valid attributes" do
39
- task = FactoryGirl.create(:task)
37
+ task = create(:task)
40
38
  expect(task).to be_valid
41
39
  expect(task.errors).to be_empty
42
40
  end
@@ -47,14 +45,14 @@ describe Task do
47
45
  end
48
46
 
49
47
  it "should create a task with due date selected from dropdown within #{offset ? 'different' : 'current'} timezone" do
50
- task = FactoryGirl.create(:task, due_at: Time.now.end_of_week, bucket: "due_this_week")
48
+ task = create(:task, due_at: Time.now.end_of_week, bucket: "due_this_week")
51
49
  expect(task.errors).to be_empty
52
50
  expect(task.bucket).to eq("due_this_week")
53
51
  expect(task.due_at.change(usec: 0)).to eq(Time.zone.now.end_of_week.change(usec: 0))
54
52
  end
55
53
 
56
54
  it "should create a task with due date selected from the calendar within #{offset ? 'different' : 'current'} timezone" do
57
- task = FactoryGirl.create(:task, bucket: "specific_time", calendar: "2020-03-20")
55
+ task = create(:task, bucket: "specific_time", calendar: "2020-03-20")
58
56
  expect(task.errors).to be_empty
59
57
  expect(task.bucket).to eq("specific_time")
60
58
  expect(task.due_at.to_i).to eq(Time.parse("2020-03-20").to_i)
@@ -64,23 +62,23 @@ describe Task do
64
62
 
65
63
  describe "Task/Update" do
66
64
  it "should update task name" do
67
- task = FactoryGirl.create(:task, name: "Hello")
65
+ task = create(:task, name: "Hello")
68
66
  task.update_attributes(name: "World")
69
67
  expect(task.errors).to be_empty
70
68
  expect(task.name).to eq("World")
71
69
  end
72
70
 
73
71
  it "should update task category" do
74
- task = FactoryGirl.create(:task, category: "call")
72
+ task = create(:task, category: "call")
75
73
  task.update_attributes(category: "email")
76
74
  expect(task.errors).to be_empty
77
75
  expect(task.category).to eq("email")
78
76
  end
79
77
 
80
78
  it "should reassign the task to another person" do
81
- him = FactoryGirl.create(:user)
82
- her = FactoryGirl.create(:user)
83
- task = FactoryGirl.create(:task, assigned_to: him.id)
79
+ him = create(:user)
80
+ her = create(:user)
81
+ task = create(:task, assigned_to: him.id)
84
82
  task.update_attributes(assigned_to: her.id)
85
83
  expect(task.errors).to be_empty
86
84
  expect(task.assigned_to).to eq(her.id)
@@ -88,8 +86,8 @@ describe Task do
88
86
  end
89
87
 
90
88
  it "should reassign the task from another person to myself" do
91
- him = FactoryGirl.create(:user)
92
- task = FactoryGirl.create(:task, assigned_to: him.id)
89
+ him = create(:user)
90
+ task = create(:task, assigned_to: him.id)
93
91
  task.update_attributes(assigned_to: "")
94
92
  expect(task.errors).to be_empty
95
93
  expect(task.assigned_to).to eq(nil)
@@ -102,7 +100,7 @@ describe Task do
102
100
  end
103
101
 
104
102
  it "should update due date based on selected bucket within #{offset ? 'different' : 'current'} timezone" do
105
- task = FactoryGirl.create(:task, due_at: Time.now.midnight.tomorrow, bucket: "due_tomorrow")
103
+ task = create(:task, due_at: Time.now.midnight.tomorrow, bucket: "due_tomorrow")
106
104
  task.update_attributes(bucket: "due_this_week")
107
105
  expect(task.errors).to be_empty
108
106
  expect(task.bucket).to eq("due_this_week")
@@ -110,7 +108,7 @@ describe Task do
110
108
  end
111
109
 
112
110
  it "should update due date if specific calendar date selected within #{offset ? 'different' : 'current'} timezone" do
113
- task = FactoryGirl.create(:task, due_at: Time.now.midnight.tomorrow, bucket: "due_tomorrow")
111
+ task = create(:task, due_at: Time.now.midnight.tomorrow, bucket: "due_tomorrow")
114
112
  task.update_attributes(bucket: "specific_time", calendar: "2020-03-20")
115
113
  expect(task.errors).to be_empty
116
114
  expect(task.bucket).to eq("specific_time")
@@ -120,45 +118,48 @@ describe Task do
120
118
  end
121
119
 
122
120
  describe "Task/Complete" do
123
- it "should comlete a task that is overdue" do
124
- task = FactoryGirl.create(:task, due_at: 2.days.ago, bucket: "overdue")
125
- task.update_attributes(completed_at: Time.now, completed_by: current_user.id)
121
+ it "should complete a task that is overdue" do
122
+ task = create(:task, due_at: 2.days.ago, bucket: "overdue")
123
+ task.update_attributes(completed_at: Time.now, completed_by: task.user.id)
124
+
126
125
  expect(task.errors).to be_empty
127
126
  expect(task.completed_at).not_to eq(nil)
128
- expect(task.completor).to eq(current_user)
127
+ expect(task.completor).to eq(task.user)
129
128
  end
130
129
 
131
130
  it "should complete a task due sometime in the future" do
132
- task = FactoryGirl.create(:task, due_at: Time.now.midnight.tomorrow, bucket: "due_tomorrow")
133
- task.update_attributes(completed_at: Time.now, completed_by: current_user.id)
131
+ task = create(:task, due_at: Time.now.midnight.tomorrow, bucket: "due_tomorrow")
132
+ task.update_attributes(completed_at: Time.now, completed_by: task.user.id)
133
+
134
134
  expect(task.errors).to be_empty
135
135
  expect(task.completed_at).not_to eq(nil)
136
- expect(task.completor).to eq(current_user)
136
+ expect(task.completor).to eq(task.user)
137
137
  end
138
138
 
139
139
  it "should complete a task that is due on specific date in the future" do
140
- task = FactoryGirl.create(:task, calendar: "10/10/2022 12:00 AM", bucket: "specific_time")
140
+ task = create(:task, calendar: "10/10/2022 12:00 AM", bucket: "specific_time")
141
141
  task.calendar = nil # Calendar is not saved in the database; we need it only to set the :due_at.
142
- task.update_attributes(completed_at: Time.now, completed_by: current_user.id)
142
+ task.update_attributes(completed_at: Time.now, completed_by: task.user.id)
143
143
  expect(task.errors).to be_empty
144
144
  expect(task.completed_at).not_to eq(nil)
145
- expect(task.completor).to eq(current_user)
145
+ expect(task.completor).to eq(task.user)
146
146
  end
147
147
 
148
148
  it "should complete a task that is due on specific date in the past" do
149
- task = FactoryGirl.create(:task, calendar: "10/10/1992 12:00 AM", bucket: "specific_time")
149
+ task = create(:task, calendar: "10/10/1992 12:00 AM", bucket: "specific_time")
150
150
  task.calendar = nil # Calendar is not saved in the database; we need it only to set the :due_at.
151
- task.update_attributes(completed_at: Time.now, completed_by: current_user.id)
151
+ task.update_attributes(completed_at: Time.now, completed_by: task.user.id)
152
152
  expect(task.errors).to be_empty
153
153
  expect(task.completed_at).not_to eq(nil)
154
- expect(task.completor).to eq(current_user)
154
+ expect(task.completor).to eq(task.user)
155
155
  end
156
156
 
157
157
  it "completion should preserve original due date" do
158
158
  due_at = Time.now - 42.days
159
- task = FactoryGirl.create(:task, due_at: due_at, bucket: "specific_time",
160
- calendar: due_at.strftime('%Y-%m-%d %H:%M'))
161
- task.update_attributes(completed_at: Time.now, completed_by: current_user.id, calendar: '')
159
+ task = create(:task, due_at: due_at, bucket: "specific_time",
160
+ calendar: due_at.strftime('%Y-%m-%d %H:%M'))
161
+ task.update_attributes(completed_at: Time.now, completed_by: task.user.id, calendar: '')
162
+
162
163
  expect(task.completed?).to eq(true)
163
164
  expect(task.due_at).to eq(due_at.utc.strftime('%Y-%m-%d %H:%M'))
164
165
  end
@@ -166,64 +167,70 @@ describe Task do
166
167
 
167
168
  # named_scope :my, lambda { |user| { :conditions => [ "(user_id = ? AND assigned_to IS NULL) OR assigned_to = ?", user.id, user.id ], :include => :assignee } }
168
169
  describe "task.my?" do
170
+ let(:current_user) { create(:user) }
171
+
169
172
  it "should match a task created by the user" do
170
- task = FactoryGirl.create(:task, user: current_user, assignee: nil)
173
+ task = create(:task, user: current_user, assignee: nil)
171
174
  expect(task.my?(current_user)).to eq(true)
172
175
  end
173
176
 
174
177
  it "should match a task assigned to the user" do
175
- task = FactoryGirl.create(:task, user: FactoryGirl.create(:user), assignee: current_user)
178
+ task = create(:task, user: create(:user), assignee: current_user)
176
179
  expect(task.my?(current_user)).to eq(true)
177
180
  end
178
181
 
179
182
  it "should Not match a task not created by the user" do
180
- task = FactoryGirl.create(:task, user: FactoryGirl.create(:user))
183
+ task = create(:task, user: create(:user))
181
184
  expect(task.my?(current_user)).to eq(false)
182
185
  end
183
186
 
184
187
  it "should Not match a task created by the user but assigned to somebody else" do
185
- task = FactoryGirl.create(:task, user: current_user, assignee: FactoryGirl.create(:user))
188
+ task = create(:task, user: current_user, assignee: create(:user))
186
189
  expect(task.my?(current_user)).to eq(false)
187
190
  end
188
191
  end
189
192
 
190
193
  # named_scope :assigned_by, lambda { |user| { :conditions => [ "user_id = ? AND assigned_to IS NOT NULL AND assigned_to != ?", user.id, user.id ], :include => :assignee } }
191
194
  describe "task.assigned_by?" do
195
+ let(:current_user) { create(:user) }
196
+
192
197
  it "should match a task assigned by the user to somebody else" do
193
- task = FactoryGirl.create(:task, user: current_user, assignee: FactoryGirl.create(:user))
198
+ task = create(:task, user: current_user, assignee: create(:user))
194
199
  expect(task.assigned_by?(current_user)).to eq(true)
195
200
  end
196
201
 
197
202
  it "should Not match a task not created by the user" do
198
- task = FactoryGirl.create(:task, user: FactoryGirl.create(:user))
203
+ task = create(:task, user: create(:user))
199
204
  expect(task.assigned_by?(current_user)).to eq(false)
200
205
  end
201
206
 
202
207
  it "should Not match a task not assigned to anybody" do
203
- task = FactoryGirl.create(:task, assignee: nil)
208
+ task = create(:task, assignee: nil)
204
209
  expect(task.assigned_by?(current_user)).to eq(false)
205
210
  end
206
211
 
207
212
  it "should Not match a task assigned to the user" do
208
- task = FactoryGirl.create(:task, assignee: current_user)
213
+ task = create(:task, assignee: current_user)
209
214
  expect(task.assigned_by?(current_user)).to eq(false)
210
215
  end
211
216
  end
212
217
 
213
218
  # named_scope :tracked_by, lambda { |user| { :conditions => [ "user_id = ? OR assigned_to = ?", user.id, user.id ], :include => :assignee } }
214
219
  describe "task.tracked_by?" do
220
+ let(:current_user) { create(:user) }
221
+
215
222
  it "should match a task created by the user" do
216
- task = FactoryGirl.create(:task, user: current_user)
223
+ task = create(:task, user: current_user)
217
224
  expect(task.tracked_by?(current_user)).to eq(true)
218
225
  end
219
226
 
220
227
  it "should match a task assigned to the user" do
221
- task = FactoryGirl.create(:task, assignee: current_user)
228
+ task = create(:task, assignee: current_user)
222
229
  expect(task.tracked_by?(current_user)).to eq(true)
223
230
  end
224
231
 
225
232
  it "should Not match a task that is neither created nor assigned to the user" do
226
- task = FactoryGirl.create(:task, user: FactoryGirl.create(:user), assignee: FactoryGirl.create(:user))
233
+ task = create(:task, user: create(:user), assignee: create(:user))
227
234
  expect(task.tracked_by?(current_user)).to eq(false)
228
235
  end
229
236
  end
@@ -310,24 +317,24 @@ describe Task do
310
317
 
311
318
  describe "Exportable" do
312
319
  describe "unassigned tasks" do
313
- let(:task1) { FactoryGirl.build(:task, user: FactoryGirl.create(:user), assignee: nil) }
314
- let(:task2) { FactoryGirl.build(:task, user: FactoryGirl.create(:user, first_name: nil, last_name: nil), assignee: nil) }
320
+ let(:task1) { build(:task, user: create(:user), assignee: nil) }
321
+ let(:task2) { build(:task, user: create(:user, first_name: nil, last_name: nil), assignee: nil) }
315
322
  it_should_behave_like("exportable") do
316
323
  let(:exported) { [task1, task2] }
317
324
  end
318
325
  end
319
326
 
320
327
  describe "assigned tasks" do
321
- let(:task1) { FactoryGirl.build(:task, user: FactoryGirl.create(:user), assignee: FactoryGirl.create(:user)) }
322
- let(:task2) { FactoryGirl.build(:task, user: FactoryGirl.create(:user, first_name: nil, last_name: nil), assignee: FactoryGirl.create(:user, first_name: nil, last_name: nil)) }
328
+ let(:task1) { build(:task, user: create(:user), assignee: create(:user)) }
329
+ let(:task2) { build(:task, user: create(:user, first_name: nil, last_name: nil), assignee: create(:user, first_name: nil, last_name: nil)) }
323
330
  it_should_behave_like("exportable") do
324
331
  let(:exported) { [task1, task2] }
325
332
  end
326
333
  end
327
334
 
328
335
  describe "completed tasks" do
329
- let(:task1) { FactoryGirl.build(:task, user: FactoryGirl.create(:user), completor: FactoryGirl.create(:user), completed_at: 1.day.ago) }
330
- let(:task2) { FactoryGirl.build(:task, user: FactoryGirl.create(:user, first_name: nil, last_name: nil), completor: FactoryGirl.create(:user, first_name: nil, last_name: nil), completed_at: 1.day.ago) }
336
+ let(:task1) { build(:task, user: create(:user), completor: create(:user), completed_at: 1.day.ago) }
337
+ let(:task2) { build(:task, user: create(:user, first_name: nil, last_name: nil), completor: create(:user, first_name: nil, last_name: nil), completed_at: 1.day.ago) }
331
338
  it_should_behave_like("exportable") do
332
339
  let(:exported) { [task1, task2] }
333
340
  end
@@ -345,13 +352,13 @@ describe Task do
345
352
  describe "scopes" do
346
353
  context "visible_on_dashboard" do
347
354
  before :each do
348
- @user = FactoryGirl.create(:user)
349
- @t1 = FactoryGirl.create(:task, user: @user)
350
- @t2 = FactoryGirl.create(:task, user: @user, assignee: FactoryGirl.create(:user))
351
- @t3 = FactoryGirl.create(:task, user: FactoryGirl.create(:user), assignee: @user)
352
- @t4 = FactoryGirl.create(:task, user: FactoryGirl.create(:user), assignee: FactoryGirl.create(:user))
353
- @t5 = FactoryGirl.create(:task, user: FactoryGirl.create(:user), assignee: @user)
354
- @t6 = FactoryGirl.create(:completed_task, assignee: @user)
355
+ @user = create(:user)
356
+ @t1 = create(:task, user: @user)
357
+ @t2 = create(:task, user: @user, assignee: create(:user))
358
+ @t3 = create(:task, user: create(:user), assignee: @user)
359
+ @t4 = create(:task, user: create(:user), assignee: create(:user))
360
+ @t5 = create(:task, user: create(:user), assignee: @user)
361
+ @t6 = create(:completed_task, assignee: @user)
355
362
  end
356
363
 
357
364
  it "should show tasks which have been created by the user and are unassigned" do
@@ -377,10 +384,10 @@ describe Task do
377
384
 
378
385
  context "by_due_at" do
379
386
  it "should show tasks ordered by due_at" do
380
- t1 = FactoryGirl.create(:task, name: 't1', bucket: "due_asap")
381
- t2 = FactoryGirl.create(:task, calendar: 5.days.from_now.strftime("%Y-%m-%d %H:%M"), bucket: "specific_time")
382
- t3 = FactoryGirl.create(:task, name: 't3', bucket: "due_next_week")
383
- t4 = FactoryGirl.create(:task, calendar: 20.days.from_now.strftime("%Y-%m-%d %H:%M"), bucket: "specific_time")
387
+ t1 = create(:task, name: 't1', bucket: "due_asap")
388
+ t2 = create(:task, calendar: 5.days.from_now.strftime("%Y-%m-%d %H:%M"), bucket: "specific_time")
389
+ t3 = create(:task, name: 't3', bucket: "due_next_week")
390
+ t4 = create(:task, calendar: 20.days.from_now.strftime("%Y-%m-%d %H:%M"), bucket: "specific_time")
384
391
  expect(Task.by_due_at).to eq([t1, t2, t3, t4])
385
392
  end
386
393
  end