-
Notifications
You must be signed in to change notification settings - Fork 56
Expand file tree
/
Copy pathproject_spec.rb
More file actions
194 lines (160 loc) · 5.28 KB
/
project_spec.rb
File metadata and controls
194 lines (160 loc) · 5.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
require 'rails_helper'
describe Project do
describe 'next' do
before do
@first = create(:project)
@second = create(:project)
@third = create(:project)
end
it 'returns the next project (sorted by id)' do
expect(@first.next).to eq(@second)
expect(@second.next).to eq(@third)
end
it 'sorts by episode' do
create(:episode).active = true
episode = create(:episode)
@first.episodes << episode
@third.episodes << episode
expect(@first.next(episode)).to eq(@third)
end
end
describe 'previous' do
before do
@first = create(:project)
@second = create(:project)
@third = create(:project)
end
it 'returns the previous project (sorted by id)' do
expect(@second.previous).to eq(@first)
expect(@third.previous).to eq(@second)
end
it 'sorts by episodes' do
create(:episode).active = true
episode = create(:episode)
@first.episodes << episode
@third.episodes << episode
expect(@third.previous(episode)).to eq(@first)
end
end
describe 'active?' do
it 'returns true for ideas' do
expect(FactoryBot.create(:idea).active?).to eq(true)
end
it 'it returns true for projects' do
expect(FactoryBot.create(:project).active?).to eq(true)
end
it 'returns false for anything that is not an idea or project' do
expect(FactoryBot.create(:invention).active?).to eq(false)
expect(FactoryBot.create(:record).active?).to eq(false)
end
end
describe 'join!' do
before do
@project = FactoryBot.create(:project)
@idea = FactoryBot.create(:idea)
# We sort updates by updated_at, make sure it's different from the creation updates
sleep 1
@user = FactoryBot.create(:user)
@project.join!(@user)
@idea.join!(@user)
end
it 'converts a project state from "idea" to "project"' do
expect(@idea.project?).to eq(true)
end
it 'adds a user to the project' do
expect(@project.users).to include(@user)
end
it 'creates an Update object assigned to the user' do
expect(@project.updates.first.author).to eq(@user)
end
context 'when project has no users (state == idea)' do
it { expect(@idea.updates.first.text).to eq('started') }
end
context 'when project has a user (state == project)' do
it { expect(@project.updates.first.text).to eq('joined') }
end
end
describe 'leave!' do
before do
@project = FactoryBot.create(:project)
# We sort updates by updated_at, make sure it's different from the creation updates
sleep 1
@user = @project.users.first
@project.leave!(@user)
end
it 'removes a user from the project' do
expect(@project.users).not_to include(@user)
end
it 'creates an Update for the user with text "left"' do
expect(@project.updates.first.author).to eq(@user)
expect(@project.updates.first.text).to eq('left')
end
context 'when the removed user was the last one' do
it { expect(@project.idea?).to eq(true) }
end
end
describe 'destroy', :search do
it 'deletes associated comments' do
project = create :project, :with_comments
project.destroy!
expect(Comment.count).to be 0
end
end
describe 'similar_projects' do
let(:project) { create(:project) }
let(:project2) { create(:project) }
let(:user) { create(:user) }
before do
project.add_keyword! 'web', user
project2.add_keyword! 'web', user
end
it 'gives an empty array when there is no common keyword' do
project2.remove_keyword!('web', user)
expect(project.similar_projects_keywords).to eq([])
end
it 'provides array of common keywords in projects' do
expect(project.similar_projects_keywords).to include(Keyword.find_by_name('web'))
end
end
describe '.joined?' do
let(:project) { create(:project) }
let(:user) { create(:user) }
let(:user2) { create(:user) }
it 'returns true if user is there' do
project.users = [user]
expect(project.joined?(user)).to eq(true)
end
it 'returns false if user the project has no users' do
project.users = []
expect(project.joined?(user)).to eq(false)
end
it 'returns false if user is not there' do
project.users = [user2]
expect(project.joined?(user)).to eq(false)
end
end
describe 'send_notification' do
let(:user) { create :user }
let(:user2) { create :user }
let(:project) { create :project }
it 'send notification to project_followers' do
project.project_followers << user
project.send_notification user2, 'msg'
expect(Notification.where(recipient: user).count).to eq(1)
end
end
describe 'emoji support' do
it 'saves and retrieves project descriptions with emoji characters' do
emoji_description = 'Project with emojis 😱🎉👍 and more text'
project = create(:project, description: emoji_description)
project.reload
expect(project.description).to eq(emoji_description)
end
it 'saves and retrieves project titles with emoji characters' do
emoji_title = 'My Awesome Project 🚀'
project = create(:project, title: emoji_title)
project.reload
expect(project.title).to eq(emoji_title)
end
end
end