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.
- checksums.yaml +4 -4
- data/.dockerignore +11 -0
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +30 -8
- data/.travis.yml +14 -9
- data/CHANGELOG.md +43 -7
- data/CONTRIBUTORS.md +95 -53
- data/Gemfile +11 -7
- data/Gemfile.lock +83 -83
- data/README.md +7 -4
- data/app/assets/javascripts/crm.js.coffee +3 -3
- data/app/assets/javascripts/crm_select2.js.coffee +15 -14
- data/app/controllers/admin/field_groups_controller.rb +8 -1
- data/app/controllers/admin/fields_controller.rb +4 -4
- data/app/controllers/admin/groups_controller.rb +1 -1
- data/app/controllers/admin/tags_controller.rb +1 -1
- data/app/controllers/application_controller.rb +11 -0
- data/app/controllers/authentications_controller.rb +1 -1
- data/app/controllers/comments_controller.rb +15 -7
- data/app/controllers/entities/campaigns_controller.rb +7 -2
- data/app/controllers/entities/leads_controller.rb +9 -2
- data/app/controllers/entities/opportunities_controller.rb +13 -2
- data/app/controllers/entities_controller.rb +10 -5
- data/app/controllers/lists_controller.rb +5 -1
- data/app/controllers/tasks_controller.rb +15 -1
- data/app/helpers/accounts_helper.rb +1 -1
- data/app/helpers/application_helper.rb +2 -2
- data/app/helpers/leads_helper.rb +1 -1
- data/app/helpers/opportunities_helper.rb +56 -3
- data/app/helpers/tags_helper.rb +1 -1
- data/app/models/entities/lead.rb +0 -7
- data/app/models/entities/opportunity.rb +3 -2
- data/app/models/observers/opportunity_observer.rb +4 -4
- data/app/models/users/ability.rb +3 -4
- data/app/views/campaigns/_metrics.html.haml +3 -3
- data/app/views/home/_opportunity.html.haml +4 -19
- data/app/views/opportunities/_index_long.html.haml +1 -24
- data/app/views/opportunities/_sidebar_show.html.haml +3 -3
- data/app/views/opportunities/_top_section.html.haml +1 -1
- data/db/schema.rb +0 -3
- data/fat_free_crm.gemspec +1 -1
- data/lib/fat_free_crm/core_ext/string.rb +1 -1
- data/lib/fat_free_crm/engine.rb +2 -2
- data/lib/fat_free_crm/fields.rb +1 -1
- data/lib/fat_free_crm/permissions.rb +0 -14
- data/lib/fat_free_crm/version.rb +2 -2
- data/lib/tasks/ffcrm/setup.rake +4 -4
- data/spec/controllers/admin/users_controller_spec.rb +27 -27
- data/spec/controllers/authentications_controller_spec.rb +7 -7
- data/spec/controllers/comments_controller_spec.rb +13 -13
- data/spec/controllers/emails_controller_spec.rb +2 -2
- data/spec/controllers/entities/accounts_controller_spec.rb +56 -56
- data/spec/controllers/entities/campaigns_controller_spec.rb +66 -66
- data/spec/controllers/entities/contacts_controller_spec.rb +67 -67
- data/spec/controllers/entities/leads_controller_spec.rb +125 -125
- data/spec/controllers/entities/opportunities_controller_spec.rb +100 -100
- data/spec/controllers/home_controller_spec.rb +26 -26
- data/spec/controllers/passwords_controller_spec.rb +1 -1
- data/spec/controllers/tasks_controller_spec.rb +37 -37
- data/spec/controllers/users_controller_spec.rb +18 -18
- data/spec/factories/account_factories.rb +8 -8
- data/spec/factories/campaign_factories.rb +5 -5
- data/spec/factories/contact_factories.rb +10 -10
- data/spec/factories/field_factories.rb +7 -7
- data/spec/factories/lead_factories.rb +8 -8
- data/spec/factories/list_factories.rb +1 -1
- data/spec/factories/opportunity_factories.rb +6 -6
- data/spec/factories/sequences.rb +1 -1
- data/spec/factories/setting_factories.rb +3 -3
- data/spec/factories/shared_factories.rb +14 -14
- data/spec/factories/subscription_factories.rb +1 -1
- data/spec/factories/tag_factories.rb +1 -1
- data/spec/factories/task_factories.rb +4 -4
- data/spec/factories/user_factories.rb +13 -13
- data/spec/features/accounts_spec.rb +17 -4
- data/spec/features/admin/groups_spec.rb +1 -1
- data/spec/features/admin/users_spec.rb +1 -1
- data/spec/features/campaigns_spec.rb +4 -4
- data/spec/features/contacts_spec.rb +10 -4
- data/spec/features/dashboard_spec.rb +7 -7
- data/spec/features/leads_spec.rb +4 -4
- data/spec/features/opportunities_overview_spec.rb +15 -15
- data/spec/features/opportunities_spec.rb +34 -8
- data/spec/features/support/autocomlete_helper.rb +17 -0
- data/spec/features/support/browser.rb +3 -8
- data/spec/features/support/helpers.rb +1 -1
- data/spec/features/tasks_spec.rb +4 -4
- data/spec/helpers/admin/field_groups_helper_spec.rb +1 -1
- data/spec/helpers/application_helper_spec.rb +1 -1
- data/spec/helpers/tasks_helper_spec.rb +1 -1
- data/spec/helpers/users_helper_spec.rb +3 -3
- data/spec/lib/comment_extensions_spec.rb +1 -1
- data/spec/lib/mail_processor/base_spec.rb +3 -3
- data/spec/lib/mail_processor/comment_replies_spec.rb +3 -3
- data/spec/lib/mail_processor/dropbox_spec.rb +16 -16
- data/spec/lib/permissions_spec.rb +7 -25
- data/spec/mailers/user_mailer_spec.rb +7 -7
- data/spec/models/entities/account_spec.rb +31 -32
- data/spec/models/entities/campaign_spec.rb +18 -25
- data/spec/models/entities/contact_spec.rb +18 -21
- data/spec/models/entities/lead_spec.rb +9 -11
- data/spec/models/entities/opportunity_spec.rb +45 -45
- data/spec/models/fields/custom_field_spec.rb +17 -17
- data/spec/models/list_spec.rb +2 -2
- data/spec/models/observers/entity_observer_spec.rb +6 -6
- data/spec/models/polymorphic/address_spec.rb +1 -1
- data/spec/models/polymorphic/avatar_spec.rb +5 -5
- data/spec/models/polymorphic/comment_spec.rb +5 -5
- data/spec/models/polymorphic/task_spec.rb +65 -58
- data/spec/models/polymorphic/version_spec.rb +26 -26
- data/spec/models/setting_spec.rb +2 -2
- data/spec/models/users/preference_spec.rb +6 -6
- data/spec/models/users/user_spec.rb +26 -26
- data/spec/shared/models.rb +22 -22
- data/spec/spec_helper.rb +2 -2
- data/spec/support/auth_macros.rb +1 -1
- data/spec/support/macros.rb +3 -3
- data/spec/views/accounts/_edit.haml_spec.rb +1 -1
- data/spec/views/accounts/create.js.haml_spec.rb +2 -2
- data/spec/views/accounts/destroy.js.haml_spec.rb +1 -1
- data/spec/views/accounts/edit.js.haml_spec.rb +2 -2
- data/spec/views/accounts/index.haml_spec.rb +2 -2
- data/spec/views/accounts/index.js.haml_spec.rb +1 -1
- data/spec/views/accounts/show.haml_spec.rb +4 -4
- data/spec/views/accounts/update.js.haml_spec.rb +1 -1
- data/spec/views/admin/field_groups/create.js.haml_spec.rb +1 -1
- data/spec/views/admin/field_groups/destroy.js.haml_spec.rb +1 -1
- data/spec/views/admin/field_groups/edit.js.haml_spec.rb +1 -1
- data/spec/views/admin/field_groups/new.js.haml_spec.rb +1 -1
- data/spec/views/admin/field_groups/update.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/create.js.haml_spec.rb +2 -2
- data/spec/views/admin/users/destroy.js.haml_spec.rb +2 -2
- data/spec/views/admin/users/edit.js.haml_spec.rb +2 -2
- data/spec/views/admin/users/index.haml_spec.rb +1 -1
- data/spec/views/admin/users/index.js.haml_spec.rb +2 -2
- data/spec/views/admin/users/reactivate.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/suspend.js.haml_spec.rb +1 -1
- data/spec/views/admin/users/update.js.haml_spec.rb +1 -1
- data/spec/views/application/auto_complete.haml_spec.rb +3 -3
- data/spec/views/campaigns/_edit.haml_spec.rb +1 -1
- data/spec/views/campaigns/create.js.haml_spec.rb +3 -3
- data/spec/views/campaigns/destroy.js.haml_spec.rb +1 -1
- data/spec/views/campaigns/edit.js.haml_spec.rb +2 -2
- data/spec/views/campaigns/index.haml_spec.rb +1 -1
- data/spec/views/campaigns/index.js.haml_spec.rb +1 -1
- data/spec/views/campaigns/show.haml_spec.rb +4 -4
- data/spec/views/campaigns/update.js.haml_spec.rb +1 -1
- data/spec/views/contacts/_edit.haml_spec.rb +7 -7
- data/spec/views/contacts/_new.haml_spec.rb +1 -1
- data/spec/views/contacts/create.js.haml_spec.rb +4 -4
- data/spec/views/contacts/destroy.js.haml_spec.rb +1 -1
- data/spec/views/contacts/edit.js.haml_spec.rb +3 -3
- data/spec/views/contacts/index.haml_spec.rb +1 -1
- data/spec/views/contacts/index.js.html_spec.rb +1 -1
- data/spec/views/contacts/new.js.haml_spec.rb +1 -1
- data/spec/views/contacts/show.haml_spec.rb +3 -3
- data/spec/views/contacts/update.js.haml_spec.rb +2 -2
- data/spec/views/home/index.haml_spec.rb +1 -1
- data/spec/views/home/index.js.haml_spec.rb +1 -1
- data/spec/views/home/options.js.haml_spec.rb +2 -2
- data/spec/views/leads/_convert.haml_spec.rb +3 -3
- data/spec/views/leads/_edit.haml_spec.rb +2 -2
- data/spec/views/leads/_new.haml_spec.rb +2 -2
- data/spec/views/leads/_sidebar_show.haml_spec.rb +5 -5
- data/spec/views/leads/convert.js.haml_spec.rb +4 -4
- data/spec/views/leads/create.js.haml_spec.rb +5 -5
- data/spec/views/leads/destroy.js.haml_spec.rb +2 -2
- data/spec/views/leads/edit.js.haml_spec.rb +4 -4
- data/spec/views/leads/index.haml_spec.rb +1 -1
- data/spec/views/leads/index.js.haml_spec.rb +1 -1
- data/spec/views/leads/new.js.haml_spec.rb +1 -1
- data/spec/views/leads/promote.js.haml_spec.rb +7 -7
- data/spec/views/leads/reject.js.haml_spec.rb +2 -2
- data/spec/views/leads/show.haml_spec.rb +2 -2
- data/spec/views/leads/update.js.haml_spec.rb +4 -4
- data/spec/views/opportunities/_edit.haml_spec.rb +7 -7
- data/spec/views/opportunities/_new.haml_spec.rb +2 -2
- data/spec/views/opportunities/create.js.haml_spec.rb +6 -6
- data/spec/views/opportunities/destroy.js.haml_spec.rb +3 -3
- data/spec/views/opportunities/edit.js.haml_spec.rb +3 -3
- data/spec/views/opportunities/index.haml_spec.rb +1 -1
- data/spec/views/opportunities/index.js.haml_spec.rb +1 -1
- data/spec/views/opportunities/new.js.haml_spec.rb +1 -1
- data/spec/views/opportunities/show.haml_spec.rb +3 -3
- data/spec/views/opportunities/update.js.haml_spec.rb +4 -4
- data/spec/views/tasks/_edit.haml_spec.rb +1 -1
- data/spec/views/tasks/complete.js.haml_spec.rb +4 -4
- data/spec/views/tasks/create.js.haml_spec.rb +6 -6
- data/spec/views/tasks/destroy.js.haml_spec.rb +2 -2
- data/spec/views/tasks/index.haml_spec.rb +4 -4
- data/spec/views/tasks/new.js.haml_spec.rb +1 -1
- data/spec/views/tasks/uncomplete.js.haml_spec.rb +2 -2
- data/spec/views/tasks/update.js.haml_spec.rb +18 -18
- data/spec/views/users/upload_avatar.js.haml_spec.rb +2 -2
- 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
|
-
|
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
|
-
|
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|
|
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
|
-
|
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
|
-
|
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|
|
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|
|
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
|
-
|
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
|
-
|
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|
|
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 =
|
16
|
+
@me = create(:user)
|
17
17
|
login_as_user(@me)
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
46
|
-
|
47
|
-
|
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
|
data/spec/features/leads_spec.rb
CHANGED
@@ -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|
|
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
|
-
|
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
|
-
|
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|
|
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 =
|
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 =
|
32
|
-
|
33
|
-
|
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 =
|
36
|
-
account1 =
|
37
|
-
|
38
|
-
|
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 =
|
41
|
-
|
42
|
-
|
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
|
-
|
65
|
-
|
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
|
-
|
78
|
-
|
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|
|
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
|
-
|
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
|
-
|
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
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
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|
|
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
|
-
|
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 =
|
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
|
data/spec/features/tasks_spec.rb
CHANGED
@@ -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|
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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 =
|
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 =
|
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) {
|
12
|
-
let(:user1) {
|
13
|
-
let(:user2) {
|
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
|