Skip to content

Commit 1770864

Browse files
Merge pull request #207 from TreinaDev/feat/alterar-status-da-solicitacao-para-accepted
[Feature] Alterar status da solicitacao para accepted
2 parents 4125d13 + 1d93170 commit 1770864

13 files changed

+140
-7
lines changed

api_doc.md

+1
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ Corpo da requisição:
305305
{
306306
"invitation": {
307307
"profile_id": 3,
308+
"project_id": 5,
308309
"project_title": "Projeto Cola?Bora!",
309310
"project_description": "Projeto Legal",
310311
"project_category": "Tecnologia",

app/controllers/api/v1/invitations_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def update
2121
private
2222

2323
def invite_params
24-
invitation_params = :profile_id, :project_title,
24+
invitation_params = :profile_id, :project_id, :project_title,
2525
:project_description, :project_category,
2626
:colabora_invitation_id, :message,
2727
:expiration_date

app/models/invitation.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class Invitation < ApplicationRecord
22
belongs_to :profile
33
has_one :notification, as: :notifiable, dependent: :destroy
44

5-
validates :profile_id, :project_title, :project_description,
5+
validates :profile_id, :project_id, :project_title, :project_description,
66
:project_category, :colabora_invitation_id, presence: true
77

88
validate :expiration_date_cannot_be_in_the_past
@@ -11,6 +11,7 @@ class Invitation < ApplicationRecord
1111

1212
after_create :set_status
1313
after_create :create_notification
14+
after_create :validate_and_approve_pending_request
1415

1516
def set_status
1617
self.status = 'pending'
@@ -31,4 +32,9 @@ def truncate_description
3132
def create_notification
3233
Notification.create(profile:, notifiable: self)
3334
end
35+
36+
def validate_and_approve_pending_request
37+
pending_invitation_request = InvitationRequest.pending.find_by(profile_id:, project_id:)
38+
pending_invitation_request&.accepted!
39+
end
3440
end

app/models/invitation_request.rb

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ class InvitationRequest < ApplicationRecord
77

88
after_create :queue_request_invitation_job
99

10+
def accepted!
11+
super if pending?
12+
end
13+
1014
def process_colabora_api_response(response)
1115
response = json_treated_response(response)
1216
if response.keys.first == 'data'

app/services/invitation_request_service.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module InvitationRequestService
22
COLABORA_PROJECTS_URL = 'http://localhost:3000/api/v1/projects'.freeze
3+
COLABORA_INVITATIONS_BASE_URL = 'http://localhost:3000/api/v1/invitations'.freeze
34

45
class ColaboraProject
56
def self.send
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddProjectIdToInvitations < ActiveRecord::Migration[7.1]
2+
def change
3+
add_column :invitations, :project_id, :integer, null: false
4+
end
5+
end

db/schema.rb

+4-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/factories/invitations.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
FactoryBot.define do
22
factory :invitation do
33
profile
4+
project_id { 1 }
45
project_title { 'Projeto Cola?Bora!' }
56
project_description { 'Um projeto muito legal' }
67
project_category { 'Ruby on Rails' }

spec/models/invitation_request_spec.rb

+46
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,50 @@
1818
expect(successful_request).to be_valid
1919
end
2020
end
21+
22+
describe '#accepted!' do
23+
it 'muda o status para accepted quando o atual é pending' do
24+
invitation_request = create(:invitation_request, status: :pending)
25+
26+
invitation_request.accepted!
27+
28+
expect(invitation_request.reload.status).to eq 'accepted'
29+
end
30+
31+
it 'não muda o status para accepted quando o atual é processing' do
32+
invitation_request = create(:invitation_request, status: :processing)
33+
34+
invitation_request.accepted!
35+
36+
expect(invitation_request.reload.status).not_to eq 'accepted'
37+
expect(invitation_request.status).to eq 'processing'
38+
end
39+
40+
it 'não muda o status para accepted quando o atual é refused' do
41+
invitation_request = create(:invitation_request, status: :refused)
42+
43+
invitation_request.accepted!
44+
45+
expect(invitation_request.reload.status).not_to eq 'accepted'
46+
expect(invitation_request.status).to eq 'refused'
47+
end
48+
49+
it 'não muda o status para accepted quando o atual é error' do
50+
invitation_request = create(:invitation_request, status: :error)
51+
52+
invitation_request.accepted!
53+
54+
expect(invitation_request.reload.status).not_to eq 'accepted'
55+
expect(invitation_request.status).to eq 'error'
56+
end
57+
58+
it 'não muda o status para accepted quando o atual é aborted' do
59+
invitation_request = create(:invitation_request, status: :aborted)
60+
61+
invitation_request.accepted!
62+
63+
expect(invitation_request.reload.status).not_to eq 'accepted'
64+
expect(invitation_request.status).to eq 'aborted'
65+
end
66+
end
2167
end

spec/models/invitation_spec.rb

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
it 'pending é o padrão para status' do
2929
profile = create(:profile)
3030
invitation = Invitation.create profile_id: profile.id,
31+
project_id: 1,
3132
project_title: 'Projeto Cola?Bora!',
3233
project_description: 'Projeto Legal',
3334
project_category: 'Tecnologia',

spec/requests/apis/v1/invitations/leader_edits_invitation_status_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
context 'PATCH /api/v1/invitations/:id' do
55
it 'mudar status do convite com sucesso' do
66
profile = create(:profile)
7-
invite = Invitation.create! profile:, project_title: 'Projeto Cola?Bora!',
7+
invite = Invitation.create! profile:, project_id: 1, project_title: 'Projeto Cola?Bora!',
88
project_description: 'Projeto Legal', project_category: 'Tecnologia',
99
colabora_invitation_id: 1, message: 'Venha participar do meu projeto!',
1010
expiration_date: 1.week.from_now.to_date, status: 'pending'
@@ -27,7 +27,7 @@
2727

2828
it 'status inválido' do
2929
profile = create(:profile)
30-
invite = Invitation.create! profile:, project_title: 'Projeto Cola?Bora!',
30+
invite = Invitation.create! profile:, project_id: 1, project_title: 'Projeto Cola?Bora!',
3131
project_description: 'Projeto Legal', project_category: 'Tecnologia',
3232
colabora_invitation_id: 1, message: 'Venha participar do meu projeto!',
3333
expiration_date: 1.week.from_now.to_date, status: 'pending'

spec/requests/apis/v1/invitations/user_receives_invite_spec.rb

+32
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
post '/api/v1/invitations', params: {
1414
invitation: {
1515
profile_id: user_profile.id,
16+
project_id: 1,
1617
project_title: 'Projeto Cola?Bora!',
1718
project_description: 'Projeto Legal',
1819
project_category: 'Tecnologia',
@@ -31,6 +32,37 @@
3132
expect(user_profile.invitations.first.colabora_invitation_id).to eq 1
3233
end
3334

35+
it 'altera status da solicitação de convite de "Pendente" para "Aceita"' do
36+
user = create(:user)
37+
invitation_request = create(:invitation_request, status: :pending, profile: user.profile, project_id: 1)
38+
colabora_invitation_json = [{
39+
invitation_id: 1,
40+
expiration_date: 3.days.from_now.to_date,
41+
project_id: 1,
42+
project_title: 'Meu primeiro projeto',
43+
message: 'Venha fazer parte'
44+
}].to_json
45+
46+
fake_response = double('faraday_response', status: 200, body: colabora_invitation_json)
47+
allow(Faraday).to receive(:get).with("http://localhost:3000/api/v1/invitations?profile_id=#{user.id}")
48+
.and_return(fake_response)
49+
50+
post '/api/v1/invitations', params: {
51+
invitation: {
52+
profile_id: user.profile.id,
53+
project_id: 1,
54+
project_title: 'Projeto Cola?Bora!',
55+
project_description: 'Projeto Legal',
56+
project_category: 'Tecnologia',
57+
colabora_invitation_id: 1,
58+
message: 'Venha participar do meu projeto!',
59+
expiration_date: 1.week.from_now.to_date
60+
}
61+
}
62+
63+
expect(invitation_request.reload.status).to eq 'accepted'
64+
end
65+
3466
context 'com parâmetros inválidos' do
3567
it 'parametros em branco' do
3668
post '/api/v1/invitations'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
require 'rails_helper'
2+
3+
describe 'Solicitação de convite tem status atualizado para "aceita"' do
4+
it 'quando recebe convite para o mesmo projeto' do
5+
user = create(:user)
6+
7+
invitation_request_one = create(:invitation_request, profile: user.profile,
8+
project_id: 1, status: :pending)
9+
invitation_request_two = create(:invitation_request, profile: user.profile,
10+
project_id: 2, status: :pending)
11+
12+
json_data = File.read(Rails.root.join('./spec/support/json/projects.json'))
13+
fake_projects_response = double('faraday_response', success?: true, body: json_data)
14+
allow(Faraday).to receive(:get).with('http://localhost:3000/api/v1/projects').and_return(fake_projects_response)
15+
16+
create(:invitation, profile: user.profile, project_id: 1,
17+
project_title: 'Meu projeto', project_description: 'Projeto legal',
18+
project_category: 'Animação', colabora_invitation_id: 3,
19+
message: 'Venha fazer parte', expiration_date: 3.days.from_now.to_date)
20+
21+
login_as user
22+
visit invitation_requests_path
23+
24+
expect(invitation_request_one.reload).to be_accepted
25+
expect(invitation_request_two.reload).to be_pending
26+
27+
within "#request_#{invitation_request_one.id}" do
28+
expect(page).to have_content 'Aceita'
29+
end
30+
31+
within "#request_#{invitation_request_two.id}" do
32+
expect(page).to have_content 'Pendente'
33+
end
34+
end
35+
end

0 commit comments

Comments
 (0)