fat_free_crm 0.17.3 → 0.18.0

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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +11 -0
  3. data/.rubocop.yml +1 -1
  4. data/.rubocop_todo.yml +30 -8
  5. data/.travis.yml +14 -9
  6. data/CHANGELOG.md +43 -7
  7. data/CONTRIBUTORS.md +95 -53
  8. data/Gemfile +11 -7
  9. data/Gemfile.lock +83 -83
  10. data/README.md +7 -4
  11. data/app/assets/javascripts/crm.js.coffee +3 -3
  12. data/app/assets/javascripts/crm_select2.js.coffee +15 -14
  13. data/app/controllers/admin/field_groups_controller.rb +8 -1
  14. data/app/controllers/admin/fields_controller.rb +4 -4
  15. data/app/controllers/admin/groups_controller.rb +1 -1
  16. data/app/controllers/admin/tags_controller.rb +1 -1
  17. data/app/controllers/application_controller.rb +11 -0
  18. data/app/controllers/authentications_controller.rb +1 -1
  19. data/app/controllers/comments_controller.rb +15 -7
  20. data/app/controllers/entities/campaigns_controller.rb +7 -2
  21. data/app/controllers/entities/leads_controller.rb +9 -2
  22. data/app/controllers/entities/opportunities_controller.rb +13 -2
  23. data/app/controllers/entities_controller.rb +10 -5
  24. data/app/controllers/lists_controller.rb +5 -1
  25. data/app/controllers/tasks_controller.rb +15 -1
  26. data/app/helpers/accounts_helper.rb +1 -1
  27. data/app/helpers/application_helper.rb +2 -2
  28. data/app/helpers/leads_helper.rb +1 -1
  29. data/app/helpers/opportunities_helper.rb +56 -3
  30. data/app/helpers/tags_helper.rb +1 -1
  31. data/app/models/entities/lead.rb +0 -7
  32. data/app/models/entities/opportunity.rb +3 -2
  33. data/app/models/observers/opportunity_observer.rb +4 -4
  34. data/app/models/users/ability.rb +3 -4
  35. data/app/views/campaigns/_metrics.html.haml +3 -3
  36. data/app/views/home/_opportunity.html.haml +4 -19
  37. data/app/views/opportunities/_index_long.html.haml +1 -24
  38. data/app/views/opportunities/_sidebar_show.html.haml +3 -3
  39. data/app/views/opportunities/_top_section.html.haml +1 -1
  40. data/db/schema.rb +0 -3
  41. data/fat_free_crm.gemspec +1 -1
  42. data/lib/fat_free_crm/core_ext/string.rb +1 -1
  43. data/lib/fat_free_crm/engine.rb +2 -2
  44. data/lib/fat_free_crm/fields.rb +1 -1
  45. data/lib/fat_free_crm/permissions.rb +0 -14
  46. data/lib/fat_free_crm/version.rb +2 -2
  47. data/lib/tasks/ffcrm/setup.rake +4 -4
  48. data/spec/controllers/admin/users_controller_spec.rb +27 -27
  49. data/spec/controllers/authentications_controller_spec.rb +7 -7
  50. data/spec/controllers/comments_controller_spec.rb +13 -13
  51. data/spec/controllers/emails_controller_spec.rb +2 -2
  52. data/spec/controllers/entities/accounts_controller_spec.rb +56 -56
  53. data/spec/controllers/entities/campaigns_controller_spec.rb +66 -66
  54. data/spec/controllers/entities/contacts_controller_spec.rb +67 -67
  55. data/spec/controllers/entities/leads_controller_spec.rb +125 -125
  56. data/spec/controllers/entities/opportunities_controller_spec.rb +100 -100
  57. data/spec/controllers/home_controller_spec.rb +26 -26
  58. data/spec/controllers/passwords_controller_spec.rb +1 -1
  59. data/spec/controllers/tasks_controller_spec.rb +37 -37
  60. data/spec/controllers/users_controller_spec.rb +18 -18
  61. data/spec/factories/account_factories.rb +8 -8
  62. data/spec/factories/campaign_factories.rb +5 -5
  63. data/spec/factories/contact_factories.rb +10 -10
  64. data/spec/factories/field_factories.rb +7 -7
  65. data/spec/factories/lead_factories.rb +8 -8
  66. data/spec/factories/list_factories.rb +1 -1
  67. data/spec/factories/opportunity_factories.rb +6 -6
  68. data/spec/factories/sequences.rb +1 -1
  69. data/spec/factories/setting_factories.rb +3 -3
  70. data/spec/factories/shared_factories.rb +14 -14
  71. data/spec/factories/subscription_factories.rb +1 -1
  72. data/spec/factories/tag_factories.rb +1 -1
  73. data/spec/factories/task_factories.rb +4 -4
  74. data/spec/factories/user_factories.rb +13 -13
  75. data/spec/features/accounts_spec.rb +17 -4
  76. data/spec/features/admin/groups_spec.rb +1 -1
  77. data/spec/features/admin/users_spec.rb +1 -1
  78. data/spec/features/campaigns_spec.rb +4 -4
  79. data/spec/features/contacts_spec.rb +10 -4
  80. data/spec/features/dashboard_spec.rb +7 -7
  81. data/spec/features/leads_spec.rb +4 -4
  82. data/spec/features/opportunities_overview_spec.rb +15 -15
  83. data/spec/features/opportunities_spec.rb +34 -8
  84. data/spec/features/support/autocomlete_helper.rb +17 -0
  85. data/spec/features/support/browser.rb +3 -8
  86. data/spec/features/support/helpers.rb +1 -1
  87. data/spec/features/tasks_spec.rb +4 -4
  88. data/spec/helpers/admin/field_groups_helper_spec.rb +1 -1
  89. data/spec/helpers/application_helper_spec.rb +1 -1
  90. data/spec/helpers/tasks_helper_spec.rb +1 -1
  91. data/spec/helpers/users_helper_spec.rb +3 -3
  92. data/spec/lib/comment_extensions_spec.rb +1 -1
  93. data/spec/lib/mail_processor/base_spec.rb +3 -3
  94. data/spec/lib/mail_processor/comment_replies_spec.rb +3 -3
  95. data/spec/lib/mail_processor/dropbox_spec.rb +16 -16
  96. data/spec/lib/permissions_spec.rb +7 -25
  97. data/spec/mailers/user_mailer_spec.rb +7 -7
  98. data/spec/models/entities/account_spec.rb +31 -32
  99. data/spec/models/entities/campaign_spec.rb +18 -25
  100. data/spec/models/entities/contact_spec.rb +18 -21
  101. data/spec/models/entities/lead_spec.rb +9 -11
  102. data/spec/models/entities/opportunity_spec.rb +45 -45
  103. data/spec/models/fields/custom_field_spec.rb +17 -17
  104. data/spec/models/list_spec.rb +2 -2
  105. data/spec/models/observers/entity_observer_spec.rb +6 -6
  106. data/spec/models/polymorphic/address_spec.rb +1 -1
  107. data/spec/models/polymorphic/avatar_spec.rb +5 -5
  108. data/spec/models/polymorphic/comment_spec.rb +5 -5
  109. data/spec/models/polymorphic/task_spec.rb +65 -58
  110. data/spec/models/polymorphic/version_spec.rb +26 -26
  111. data/spec/models/setting_spec.rb +2 -2
  112. data/spec/models/users/preference_spec.rb +6 -6
  113. data/spec/models/users/user_spec.rb +26 -26
  114. data/spec/shared/models.rb +22 -22
  115. data/spec/spec_helper.rb +2 -2
  116. data/spec/support/auth_macros.rb +1 -1
  117. data/spec/support/macros.rb +3 -3
  118. data/spec/views/accounts/_edit.haml_spec.rb +1 -1
  119. data/spec/views/accounts/create.js.haml_spec.rb +2 -2
  120. data/spec/views/accounts/destroy.js.haml_spec.rb +1 -1
  121. data/spec/views/accounts/edit.js.haml_spec.rb +2 -2
  122. data/spec/views/accounts/index.haml_spec.rb +2 -2
  123. data/spec/views/accounts/index.js.haml_spec.rb +1 -1
  124. data/spec/views/accounts/show.haml_spec.rb +4 -4
  125. data/spec/views/accounts/update.js.haml_spec.rb +1 -1
  126. data/spec/views/admin/field_groups/create.js.haml_spec.rb +1 -1
  127. data/spec/views/admin/field_groups/destroy.js.haml_spec.rb +1 -1
  128. data/spec/views/admin/field_groups/edit.js.haml_spec.rb +1 -1
  129. data/spec/views/admin/field_groups/new.js.haml_spec.rb +1 -1
  130. data/spec/views/admin/field_groups/update.js.haml_spec.rb +1 -1
  131. data/spec/views/admin/users/create.js.haml_spec.rb +2 -2
  132. data/spec/views/admin/users/destroy.js.haml_spec.rb +2 -2
  133. data/spec/views/admin/users/edit.js.haml_spec.rb +2 -2
  134. data/spec/views/admin/users/index.haml_spec.rb +1 -1
  135. data/spec/views/admin/users/index.js.haml_spec.rb +2 -2
  136. data/spec/views/admin/users/reactivate.js.haml_spec.rb +1 -1
  137. data/spec/views/admin/users/suspend.js.haml_spec.rb +1 -1
  138. data/spec/views/admin/users/update.js.haml_spec.rb +1 -1
  139. data/spec/views/application/auto_complete.haml_spec.rb +3 -3
  140. data/spec/views/campaigns/_edit.haml_spec.rb +1 -1
  141. data/spec/views/campaigns/create.js.haml_spec.rb +3 -3
  142. data/spec/views/campaigns/destroy.js.haml_spec.rb +1 -1
  143. data/spec/views/campaigns/edit.js.haml_spec.rb +2 -2
  144. data/spec/views/campaigns/index.haml_spec.rb +1 -1
  145. data/spec/views/campaigns/index.js.haml_spec.rb +1 -1
  146. data/spec/views/campaigns/show.haml_spec.rb +4 -4
  147. data/spec/views/campaigns/update.js.haml_spec.rb +1 -1
  148. data/spec/views/contacts/_edit.haml_spec.rb +7 -7
  149. data/spec/views/contacts/_new.haml_spec.rb +1 -1
  150. data/spec/views/contacts/create.js.haml_spec.rb +4 -4
  151. data/spec/views/contacts/destroy.js.haml_spec.rb +1 -1
  152. data/spec/views/contacts/edit.js.haml_spec.rb +3 -3
  153. data/spec/views/contacts/index.haml_spec.rb +1 -1
  154. data/spec/views/contacts/index.js.html_spec.rb +1 -1
  155. data/spec/views/contacts/new.js.haml_spec.rb +1 -1
  156. data/spec/views/contacts/show.haml_spec.rb +3 -3
  157. data/spec/views/contacts/update.js.haml_spec.rb +2 -2
  158. data/spec/views/home/index.haml_spec.rb +1 -1
  159. data/spec/views/home/index.js.haml_spec.rb +1 -1
  160. data/spec/views/home/options.js.haml_spec.rb +2 -2
  161. data/spec/views/leads/_convert.haml_spec.rb +3 -3
  162. data/spec/views/leads/_edit.haml_spec.rb +2 -2
  163. data/spec/views/leads/_new.haml_spec.rb +2 -2
  164. data/spec/views/leads/_sidebar_show.haml_spec.rb +5 -5
  165. data/spec/views/leads/convert.js.haml_spec.rb +4 -4
  166. data/spec/views/leads/create.js.haml_spec.rb +5 -5
  167. data/spec/views/leads/destroy.js.haml_spec.rb +2 -2
  168. data/spec/views/leads/edit.js.haml_spec.rb +4 -4
  169. data/spec/views/leads/index.haml_spec.rb +1 -1
  170. data/spec/views/leads/index.js.haml_spec.rb +1 -1
  171. data/spec/views/leads/new.js.haml_spec.rb +1 -1
  172. data/spec/views/leads/promote.js.haml_spec.rb +7 -7
  173. data/spec/views/leads/reject.js.haml_spec.rb +2 -2
  174. data/spec/views/leads/show.haml_spec.rb +2 -2
  175. data/spec/views/leads/update.js.haml_spec.rb +4 -4
  176. data/spec/views/opportunities/_edit.haml_spec.rb +7 -7
  177. data/spec/views/opportunities/_new.haml_spec.rb +2 -2
  178. data/spec/views/opportunities/create.js.haml_spec.rb +6 -6
  179. data/spec/views/opportunities/destroy.js.haml_spec.rb +3 -3
  180. data/spec/views/opportunities/edit.js.haml_spec.rb +3 -3
  181. data/spec/views/opportunities/index.haml_spec.rb +1 -1
  182. data/spec/views/opportunities/index.js.haml_spec.rb +1 -1
  183. data/spec/views/opportunities/new.js.haml_spec.rb +1 -1
  184. data/spec/views/opportunities/show.haml_spec.rb +3 -3
  185. data/spec/views/opportunities/update.js.haml_spec.rb +4 -4
  186. data/spec/views/tasks/_edit.haml_spec.rb +1 -1
  187. data/spec/views/tasks/complete.js.haml_spec.rb +4 -4
  188. data/spec/views/tasks/create.js.haml_spec.rb +6 -6
  189. data/spec/views/tasks/destroy.js.haml_spec.rb +2 -2
  190. data/spec/views/tasks/index.haml_spec.rb +4 -4
  191. data/spec/views/tasks/new.js.haml_spec.rb +1 -1
  192. data/spec/views/tasks/uncomplete.js.haml_spec.rb +2 -2
  193. data/spec/views/tasks/update.js.haml_spec.rb +18 -18
  194. data/spec/views/users/upload_avatar.js.haml_spec.rb +2 -2
  195. metadata +5 -3
@@ -17,7 +17,7 @@ feature 'Groups tab', '
17
17
  end
18
18
 
19
19
  scenario 'should create a new group', js: true do
20
- FactoryGirl.create(:user, first_name: "Mr", last_name: "Spock")
20
+ create(:user, first_name: "Mr", last_name: "Spock")
21
21
  visit admin_groups_path
22
22
  expect(page).to have_content("Couldn't find any Groups.")
23
23
  click_link 'create a new group'
@@ -17,7 +17,7 @@ feature 'Users tab', '
17
17
  end
18
18
 
19
19
  scenario 'should create a new user', js: true do
20
- FactoryGirl.create(:group, name: "Superheroes")
20
+ create(:group, name: "Superheroes")
21
21
  visit admin_users_path
22
22
  click_link 'Create User'
23
23
  expect(page).to have_selector('#user_username', visible: true)
@@ -17,7 +17,7 @@ feature 'Campaigns', '
17
17
  end
18
18
 
19
19
  scenario 'should view a list of campaigns' do
20
- 3.times { |i| FactoryGirl.create(:campaign, name: "Campaign #{i}") }
20
+ 3.times { |i| create(:campaign, name: "Campaign #{i}") }
21
21
  visit campaigns_page
22
22
  expect(page).to have_content('Campaign 0')
23
23
  expect(page).to have_content('Campaign 1')
@@ -60,7 +60,7 @@ feature 'Campaigns', '
60
60
  end
61
61
 
62
62
  scenario 'should view and edit a campaign', js: true do
63
- FactoryGirl.create(:campaign, name: "My Cool Campaign")
63
+ create(:campaign, name: "My Cool Campaign")
64
64
  with_versioning do
65
65
  visit campaigns_page
66
66
  click_link 'My Cool Campaign'
@@ -76,7 +76,7 @@ feature 'Campaigns', '
76
76
  end
77
77
 
78
78
  scenario 'should delete a campaign', js: true do
79
- FactoryGirl.create(:campaign, name: "Old Campaign")
79
+ create(:campaign, name: "Old Campaign")
80
80
  visit campaigns_page
81
81
  click_link 'Old Campaign'
82
82
  click_link 'Delete?'
@@ -87,7 +87,7 @@ feature 'Campaigns', '
87
87
  end
88
88
 
89
89
  scenario 'should search for a campaign', js: true do
90
- 2.times { |i| FactoryGirl.create(:campaign, name: "Campaign #{i}") }
90
+ 2.times { |i| create(:campaign, name: "Campaign #{i}") }
91
91
  visit campaigns_page
92
92
  expect(find('#campaigns')).to have_content("Campaign 0")
93
93
  expect(find('#campaigns')).to have_content("Campaign 1")
@@ -17,7 +17,7 @@ feature 'Contacts', '
17
17
  end
18
18
 
19
19
  scenario 'should view a list of contacts' do
20
- 4.times { |i| FactoryGirl.create(:contact, first_name: "Test", last_name: "Subject \##{i}") }
20
+ 4.times { |i| create(:contact, first_name: "Test", last_name: "Subject \##{i}") }
21
21
  visit contacts_page
22
22
  expect(contacts_element).to have_content('Test Subject #0')
23
23
  expect(contacts_element).to have_content('Test Subject #1')
@@ -30,6 +30,9 @@ feature 'Contacts', '
30
30
  with_versioning do
31
31
  visit contacts_page
32
32
  click_link 'Create Contact'
33
+ select = find('#account_name', visible: true)
34
+ expect(select).to have_text("")
35
+ expect(page).to have_selector('#select2-account_id-container', visible: false)
33
36
  expect(page).to have_selector('#contact_first_name', visible: true)
34
37
  fill_in 'contact_first_name', with: 'Testy'
35
38
  fill_in 'contact_last_name', with: 'McTest'
@@ -62,11 +65,14 @@ feature 'Contacts', '
62
65
  end
63
66
 
64
67
  scenario 'should view and edit a contact', js: true do
65
- FactoryGirl.create(:contact, first_name: "Testy", last_name: "McTest")
68
+ create(:contact, first_name: "Testy", last_name: "McTest", account: create(:account, name: "Toast"))
66
69
  with_versioning do
67
70
  visit contacts_page
68
71
  click_link 'Testy McTest'
69
72
  click_link 'Edit'
73
+ select = find('#select2-account_id-container', visible: true)
74
+ expect(select).to have_text("Toast")
75
+ expect(page).to have_selector('#account_name', visible: false)
70
76
  fill_in 'contact_first_name', with: 'Test'
71
77
  fill_in 'contact_last_name', with: 'Subject'
72
78
  fill_in 'contact_email', with: "test.subject@example.com"
@@ -79,7 +85,7 @@ feature 'Contacts', '
79
85
  end
80
86
 
81
87
  scenario 'should delete a contact', js: true do
82
- FactoryGirl.create(:contact, first_name: "Test", last_name: "Subject")
88
+ create(:contact, first_name: "Test", last_name: "Subject")
83
89
  visit contacts_page
84
90
  click_link 'Test Subject'
85
91
  click_link 'Delete?'
@@ -90,7 +96,7 @@ feature 'Contacts', '
90
96
  end
91
97
 
92
98
  scenario 'should search for a contact', js: true do
93
- 2.times { |i| FactoryGirl.create(:contact, first_name: "Test", last_name: "Subject \##{i}") }
99
+ 2.times { |i| create(:contact, first_name: "Test", last_name: "Subject \##{i}") }
94
100
  visit contacts_page
95
101
  expect(contacts_element).to have_content('Test Subject #0')
96
102
  expect(contacts_element).to have_content('Test Subject #1')
@@ -13,12 +13,12 @@ feature 'Dashboard', '
13
13
  I want to see a dashboard
14
14
  ' do
15
15
  background do
16
- @me = FactoryGirl.create(:user)
16
+ @me = create(:user)
17
17
  login_as_user(@me)
18
18
 
19
- FactoryGirl.create(:task, name: 'Do your homework!', assignee: @me)
20
- FactoryGirl.create(:opportunity, name: 'Work with the Dolphins', assignee: @me, stage: 'proposal')
21
- FactoryGirl.create(:account, name: 'Dolphin Manufacturer', assignee: @me)
19
+ create(:task, name: 'Do your homework!', assignee: @me)
20
+ create(:opportunity, name: 'Work with the Dolphins', assignee: @me, stage: 'proposal')
21
+ create(:account, name: 'Dolphin Manufacturer', assignee: @me)
22
22
  end
23
23
 
24
24
  scenario "Viewing my dashboard" do
@@ -42,9 +42,9 @@ feature 'Dashboard', '
42
42
 
43
43
  scenario "Only show a maximum of 10 entities" do
44
44
  10.times do
45
- FactoryGirl.create(:task, assignee: @me)
46
- FactoryGirl.create(:opportunity, assignee: @me, stage: 'proposal')
47
- FactoryGirl.create(:account, assignee: @me)
45
+ create(:task, assignee: @me)
46
+ create(:opportunity, assignee: @me, stage: 'proposal')
47
+ create(:account, assignee: @me)
48
48
  end
49
49
 
50
50
  visit homepage
@@ -17,7 +17,7 @@ feature 'Leads', '
17
17
  end
18
18
 
19
19
  scenario 'should view a list of leads' do
20
- 4.times { |i| FactoryGirl.create(:lead, first_name: "L", last_name: "Ead #{i}") }
20
+ 4.times { |i| create(:lead, first_name: "L", last_name: "Ead #{i}") }
21
21
  visit leads_page
22
22
  expect(leads_element).to have_content('L Ead 0')
23
23
  expect(leads_element).to have_content('L Ead 1')
@@ -70,7 +70,7 @@ feature 'Leads', '
70
70
  end
71
71
 
72
72
  scenario 'should view and edit a lead', js: true do
73
- FactoryGirl.create(:lead, first_name: "Mr", last_name: "Lead", email: "mr_lead@example.com")
73
+ create(:lead, first_name: "Mr", last_name: "Lead", email: "mr_lead@example.com")
74
74
  with_versioning do
75
75
  visit leads_page
76
76
  click_link 'Mr Lead'
@@ -89,7 +89,7 @@ feature 'Leads', '
89
89
  end
90
90
 
91
91
  scenario 'should delete a lead', js: true do
92
- FactoryGirl.create(:lead, first_name: "Mr", last_name: "Lead", email: "mr_lead@example.com")
92
+ create(:lead, first_name: "Mr", last_name: "Lead", email: "mr_lead@example.com")
93
93
  visit leads_page
94
94
  click_link 'Mr Lead'
95
95
  click_link 'Delete?'
@@ -101,7 +101,7 @@ feature 'Leads', '
101
101
  end
102
102
 
103
103
  scenario 'should search for a lead', js: true do
104
- 2.times { |i| FactoryGirl.create(:lead, first_name: "Lead", last_name: "\##{i}", email: "lead#{i}@example.com") }
104
+ 2.times { |i| create(:lead, first_name: "Lead", last_name: "\##{i}", email: "lead#{i}@example.com") }
105
105
  visit leads_page
106
106
  expect(leads_element).to have_content('Lead #0')
107
107
  expect(leads_element).to have_content('Lead #1')
@@ -13,7 +13,7 @@ feature 'Opportunities Overview', "
13
13
  I want to see an overview of opportunities broken down by user
14
14
  " do
15
15
  background do
16
- @me = FactoryGirl.create(:user)
16
+ @me = create(:user)
17
17
 
18
18
  login_as_user(@me)
19
19
  end
@@ -28,18 +28,18 @@ feature 'Opportunities Overview', "
28
28
  end
29
29
 
30
30
  scenario "Viewing Opportunity Overview when all opportunities have been assigned" do
31
- user1 = FactoryGirl.create(:user, first_name: "Brian", last_name: 'Doyle-Murray')
32
- FactoryGirl.create(:opportunity, name: "Acting", stage: 'prospecting', assignee: user1)
33
- FactoryGirl.create(:opportunity, name: "Directing", stage: 'won', assignee: user1)
31
+ user1 = create(:user, first_name: "Brian", last_name: 'Doyle-Murray')
32
+ create(:opportunity, name: "Acting", stage: 'prospecting', assignee: user1)
33
+ create(:opportunity, name: "Directing", stage: 'won', assignee: user1)
34
34
 
35
- user2 = FactoryGirl.create(:user, first_name: "Dean", last_name: 'Stockwell')
36
- account1 = FactoryGirl.create(:account, name: 'Quantum Leap')
37
- FactoryGirl.create(:opportunity, name: "Leaping", stage: 'prospecting', account: account1, assignee: user2)
38
- FactoryGirl.create(:opportunity, name: "Return Home", stage: 'prospecting', account: account1, assignee: user2)
35
+ user2 = create(:user, first_name: "Dean", last_name: 'Stockwell')
36
+ account1 = create(:account, name: 'Quantum Leap')
37
+ create(:opportunity, name: "Leaping", stage: 'prospecting', account: account1, assignee: user2)
38
+ create(:opportunity, name: "Return Home", stage: 'prospecting', account: account1, assignee: user2)
39
39
 
40
- user3 = FactoryGirl.create(:user, first_name: "Chris", last_name: 'Jarvis')
41
- FactoryGirl.create(:opportunity, stage: 'won', assignee: user3)
42
- FactoryGirl.create(:opportunity, stage: 'lost', assignee: user3)
40
+ user3 = create(:user, first_name: "Chris", last_name: 'Jarvis')
41
+ create(:opportunity, stage: 'won', assignee: user3)
42
+ create(:opportunity, stage: 'lost', assignee: user3)
43
43
 
44
44
  visit opportunity_overview_page
45
45
 
@@ -61,8 +61,8 @@ feature 'Opportunities Overview', "
61
61
  end
62
62
 
63
63
  scenario "Viewing Opportunity Overview when all opportunities are unassigned" do
64
- FactoryGirl.create(:opportunity, name: "Acting", stage: 'prospecting', assignee: nil)
65
- FactoryGirl.create(:opportunity, name: "Presenting", stage: 'won', assignee: nil)
64
+ create(:opportunity, name: "Acting", stage: 'prospecting', assignee: nil)
65
+ create(:opportunity, name: "Presenting", stage: 'won', assignee: nil)
66
66
 
67
67
  visit opportunity_overview_page
68
68
 
@@ -74,8 +74,8 @@ feature 'Opportunities Overview', "
74
74
  end
75
75
 
76
76
  scenario "Viewing Opportunity Overview when there are no opportunities in the pipeline" do
77
- FactoryGirl.create(:opportunity, name: "Presenting", stage: 'lost', assignee: FactoryGirl.create(:user))
78
- FactoryGirl.create(:opportunity, name: "Eating", stage: 'won', assignee: nil)
77
+ create(:opportunity, name: "Presenting", stage: 'lost', assignee: create(:user))
78
+ create(:opportunity, name: "Eating", stage: 'won', assignee: nil)
79
79
 
80
80
  visit opportunity_overview_page
81
81
 
@@ -17,7 +17,7 @@ feature 'Opportunities', '
17
17
  end
18
18
 
19
19
  scenario 'should view a list of opportunities' do
20
- 3.times { |i| FactoryGirl.create(:opportunity, name: "Opportunity #{i}") }
20
+ 3.times { |i| create(:opportunity, name: "Opportunity #{i}") }
21
21
  visit opportunities_page
22
22
  expect(page).to have_content('Opportunity 0')
23
23
  expect(page).to have_content('Opportunity 1')
@@ -26,13 +26,18 @@ feature 'Opportunities', '
26
26
  end
27
27
 
28
28
  scenario 'should create a new opportunity', js: true do
29
- FactoryGirl.create(:account, name: 'Example Account')
29
+ create(:account, name: 'Example Account')
30
30
  with_versioning do
31
31
  visit opportunities_page
32
32
  click_link 'Create Opportunity'
33
33
  expect(page).to have_selector('#opportunity_name', visible: true)
34
34
  fill_in 'opportunity_name', with: 'My Awesome Opportunity'
35
- fill_in 'account_name', with: 'Example Account'
35
+ click_link 'select existing'
36
+ find('#select2-account_id-container').click
37
+ find('.select2-search--dropdown').find('input').set('Example Account')
38
+ sleep(1)
39
+ find('li', text: 'Example Account').click
40
+ expect(page).to have_content('Example Account')
36
41
  select 'Prospecting', from: 'opportunity_stage'
37
42
  click_link 'Comment'
38
43
  fill_in 'comment_body', with: 'This is a very important opportunity.'
@@ -48,6 +53,17 @@ feature 'Opportunities', '
48
53
  end
49
54
  end
50
55
 
56
+ scenario 'should not display ammount with zero value', js: true do
57
+ with_amount = create(:opportunity, name: 'With Amount', amount: 3000, probability: 90, discount: nil, stage: 'proposal')
58
+ without_amount = create(:opportunity, name: 'Without Amount', amount: nil, probability: nil, discount: nil, stage: 'proposal')
59
+ with_versioning do
60
+ visit opportunities_page
61
+ click_link 'Long format'
62
+ expect(find("#opportunity_#{with_amount.id}")).to have_content('$3,000 | Probability 90%')
63
+ expect(find("#opportunity_#{without_amount.id}")).not_to have_content('$0 | Discount $0 | Probability 0%')
64
+ end
65
+ end
66
+
51
67
  scenario "remembers the comment field when the creation was unsuccessful", js: true do
52
68
  visit opportunities_page
53
69
  click_link 'Create Opportunity'
@@ -61,9 +77,9 @@ feature 'Opportunities', '
61
77
  end
62
78
 
63
79
  scenario 'should view and edit an opportunity', js: true do
64
- FactoryGirl.create(:account, name: 'Example Account')
65
- FactoryGirl.create(:account, name: 'Other Example Account')
66
- FactoryGirl.create(:opportunity, name: 'A Cool Opportunity')
80
+ create(:account, name: 'Example Account')
81
+ create(:account, name: 'Other Example Account')
82
+ create(:opportunity, name: 'A Cool Opportunity')
67
83
  with_versioning do
68
84
  visit opportunities_page
69
85
  click_link 'A Cool Opportunity'
@@ -79,7 +95,7 @@ feature 'Opportunities', '
79
95
  end
80
96
 
81
97
  scenario 'should delete an opportunity', js: true do
82
- FactoryGirl.create(:opportunity, name: 'Outdated Opportunity')
98
+ create(:opportunity, name: 'Outdated Opportunity')
83
99
  visit opportunities_page
84
100
  click_link 'Outdated Opportunity'
85
101
  click_link 'Delete?'
@@ -89,7 +105,7 @@ feature 'Opportunities', '
89
105
  end
90
106
 
91
107
  scenario 'should search for an opportunity', js: true do
92
- 2.times { |i| FactoryGirl.create(:opportunity, name: "Opportunity #{i}") }
108
+ 2.times { |i| create(:opportunity, name: "Opportunity #{i}") }
93
109
  visit opportunities_page
94
110
  expect(find('#opportunities')).to have_content("Opportunity 0")
95
111
  expect(find('#opportunities')).to have_content("Opportunity 1")
@@ -103,4 +119,14 @@ feature 'Opportunities', '
103
119
  expect(find('#opportunities')).not_to have_content("Opportunity 0")
104
120
  expect(find('#opportunities')).not_to have_content("Opportunity 1")
105
121
  end
122
+
123
+ scenario 'should add note to opportunity', js: true do
124
+ opportunity = create(:opportunity, name: 'Awesome Opportunity')
125
+ visit opportunities_page
126
+ click_link 'Awesome Opportunity'
127
+ find("#opportunity_#{opportunity.id}_post_new_note").click
128
+ fill_in 'comment[comment]', with: 'Most awesome opportunity'
129
+ click_button 'Add Note'
130
+ expect(page).to have_content('Most awesome opportunity')
131
+ end
106
132
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
4
+ #
5
+ # Fat Free CRM is freely distributable under the terms of MIT license.
6
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
+ #------------------------------------------------------------------------------
8
+ def fill_autocomplete(field, options = {})
9
+ fill_in field, with: options[:with]
10
+ page.execute_script %{ $('##{field}').trigger('focus') }
11
+ page.execute_script %{ $('##{field}').trigger('keydown') }
12
+
13
+ selector = %{ul.ui-autocomplete li.ui-menu-item a:contains("#{options[:select]}")}
14
+ sleep(1)
15
+ expect(page).to have_selector('ul.ui-autocomplete li.ui-menu-item a')
16
+ page.execute_script %{ $('#{selector}').trigger('mouseenter').click() }
17
+ end
@@ -5,9 +5,9 @@
5
5
  # Fat Free CRM is freely distributable under the terms of MIT license.
6
6
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
7
  #------------------------------------------------------------------------------
8
- #
9
- # Allow tests to run in Chrome browser
10
- #
8
+ Capaybara.app_host = ENV['APP_URL'] if ENV['APP_URL']
9
+ Capybara.default_max_wait_time = 7
10
+
11
11
  if ENV['BROWSER'] == 'chrome'
12
12
  Capybara.register_driver :selenium do |app|
13
13
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: { args: ['no-sandbox', 'headless', 'disable-gpu'] })
@@ -21,8 +21,3 @@ else
21
21
  Capybara::Selenium::Driver.new(app, browser: :firefox, options: options, desired_capabilities: capabilities)
22
22
  end
23
23
  end
24
-
25
- #
26
- # Default timeout for extended for AJAX based application
27
- #
28
- Capybara.default_max_wait_time = 7
@@ -9,7 +9,7 @@ module HelperMethods
9
9
  # Put helper methods you need to be available in all acceptance specs here.
10
10
 
11
11
  def do_login(options = {})
12
- @user = FactoryGirl.create(:user, options)
12
+ @user = create(:user, options)
13
13
  visit '/login'
14
14
  fill_in "authentication_username", with: @user.username
15
15
  fill_in "authentication_password", with: @user.password
@@ -17,7 +17,7 @@ feature 'Tasks', '
17
17
  end
18
18
 
19
19
  scenario 'should view a list of tasks which are assigned to the logged in user' do
20
- 4.times { |i| FactoryGirl.create(:task, name: "Task #{i}", user: @user) }
20
+ 4.times { |i| create(:task, name: "Task #{i}", user: @user) }
21
21
  visit tasks_page
22
22
  expect(page).to have_content('Task 0')
23
23
  expect(page).to have_content('Task 1')
@@ -45,7 +45,7 @@ feature 'Tasks', '
45
45
  end
46
46
 
47
47
  scenario 'creating a task for another user', js: true do
48
- FactoryGirl.create(:user, first_name: 'Another', last_name: 'User')
48
+ create(:user, first_name: 'Another', last_name: 'User')
49
49
  with_versioning do
50
50
  visit tasks_page
51
51
  click_link 'Create Task'
@@ -72,7 +72,7 @@ feature 'Tasks', '
72
72
  end
73
73
 
74
74
  scenario 'should view and edit a task', js: true do
75
- FactoryGirl.create(:task, id: 42, name: 'Example Task', user: @user)
75
+ create(:task, id: 42, name: 'Example Task', user: @user)
76
76
  with_versioning do
77
77
  visit tasks_page
78
78
  click_edit_for_task_id(42)
@@ -85,7 +85,7 @@ feature 'Tasks', '
85
85
  end
86
86
 
87
87
  scenario 'should delete a task', js: true do
88
- FactoryGirl.create(:task, id: 42, name: 'Outdated Task', user: @user)
88
+ create(:task, id: 42, name: 'Outdated Task', user: @user)
89
89
  visit tasks_page
90
90
  click_delete_for_task_id(42)
91
91
  click_link 'Tasks'
@@ -9,7 +9,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
9
9
 
10
10
  describe Admin::FieldGroupsHelper do
11
11
  it "should return the correct info text about tag restrictions and classes for groups" do
12
- field_group = FactoryGirl.build(:field_group, klass_name: "Contact", label: "Test Field Group")
12
+ field_group = build(:field_group, klass_name: "Contact", label: "Test Field Group")
13
13
  html = helper.field_group_subtitle(field_group)
14
14
  expect(html).to include("Test Field Group")
15
15
  expect(html).to include("This field group applies to contacts tagged with")
@@ -36,7 +36,7 @@ describe ApplicationHelper do
36
36
  end
37
37
 
38
38
  it "link_to_discard" do
39
- lead = FactoryGirl.create(:lead)
39
+ lead = create(:lead)
40
40
  allow(controller.request).to receive(:fullpath).and_return("http://www.example.com/leads/#{lead.id}")
41
41
 
42
42
  link = helper.link_to_discard(lead)
@@ -10,7 +10,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
10
10
  describe TasksHelper do
11
11
  describe "responding with generated links" do
12
12
  before do
13
- @task = FactoryGirl.create(:task)
13
+ @task = create(:task)
14
14
  end
15
15
 
16
16
  it "should render link to uncomplete of a task" do
@@ -8,9 +8,9 @@
8
8
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
9
9
 
10
10
  describe UsersHelper do
11
- let(:myself) { FactoryGirl.create(:user, id: 54) }
12
- let(:user1) { FactoryGirl.create(:user, id: 60, first_name: 'Bob', last_name: "Hope") }
13
- let(:user2) { FactoryGirl.create(:user, id: 75, first_name: 'Billy', last_name: "Joel") }
11
+ let(:myself) { create(:user, id: 54) }
12
+ let(:user1) { create(:user, id: 60, first_name: 'Bob', last_name: "Hope") }
13
+ let(:user2) { create(:user, id: 75, first_name: 'Billy', last_name: "Joel") }
14
14
 
15
15
  describe "user_options_for_select" do
16
16
  it "includes 'myself'" do