feat: Add CSAT response APIs (#2503)
Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
This commit is contained in:
30
spec/builders/csat_surveys/response_builder_spec.rb
Normal file
30
spec/builders/csat_surveys/response_builder_spec.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe ::CsatSurveys::ResponseBuilder do
|
||||
let(:message) do
|
||||
create(
|
||||
:message, content_type: :input_csat,
|
||||
content_attributes: { 'submitted_values': { 'csat_survey_response': { 'rating': 5, 'feedback_message': 'hello' } } }
|
||||
)
|
||||
end
|
||||
|
||||
describe '#perform' do
|
||||
it 'creates a new csat survey response' do
|
||||
csat_survey_response = described_class.new(
|
||||
message: message
|
||||
).perform
|
||||
|
||||
expect(csat_survey_response.valid?).to eq(true)
|
||||
end
|
||||
|
||||
it 'updates the value of csat survey response if response already exists' do
|
||||
existing_survey_response = create(:csat_survey_response, message: message)
|
||||
csat_survey_response = described_class.new(
|
||||
message: message
|
||||
).perform
|
||||
|
||||
expect(csat_survey_response.id).to eq(existing_survey_response.id)
|
||||
expect(csat_survey_response.rating).to eq(5)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -18,7 +18,9 @@ RSpec.describe 'Campaigns API', type: :request do
|
||||
let!(:campaign) { create(:campaign, account: account) }
|
||||
|
||||
it 'returns unauthorized for agents' do
|
||||
get "/api/v1/accounts/#{account.id}/campaigns"
|
||||
get "/api/v1/accounts/#{account.id}/campaigns",
|
||||
headers: agent.create_new_auth_token,
|
||||
as: :json
|
||||
|
||||
expect(response).to have_http_status(:unauthorized)
|
||||
end
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe 'CSAT Survey Responses API', type: :request do
|
||||
let(:account) { create(:account) }
|
||||
let!(:csat_survey_response) { create(:csat_survey_response, account: account) }
|
||||
let(:administrator) { create(:user, account: account, role: :administrator) }
|
||||
let(:agent) { create(:user, account: account, role: :agent) }
|
||||
|
||||
describe 'GET /api/v1/accounts/{account.id}/csat_survey_responses' do
|
||||
context 'when it is an unauthenticated user' do
|
||||
it 'returns unauthorized' do
|
||||
get "/api/v1/accounts/#{account.id}/csat_survey_responses"
|
||||
|
||||
expect(response).to have_http_status(:unauthorized)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when it is an authenticated user' do
|
||||
it 'returns unauthorized for agents' do
|
||||
get "/api/v1/accounts/#{account.id}/csat_survey_responses",
|
||||
headers: agent.create_new_auth_token,
|
||||
as: :json
|
||||
|
||||
expect(response).to have_http_status(:unauthorized)
|
||||
end
|
||||
|
||||
it 'returns all the csat survey responses for administrators' do
|
||||
get "/api/v1/accounts/#{account.id}/csat_survey_responses",
|
||||
headers: administrator.create_new_auth_token,
|
||||
as: :json
|
||||
|
||||
expect(response).to have_http_status(:success)
|
||||
expect(JSON.parse(response.body).first['feedback_message']).to eq(csat_survey_response.feedback_message)
|
||||
end
|
||||
|
||||
it 'filters csat responsed based on a date range' do
|
||||
csat_10_days_ago = create(:csat_survey_response, account: account, created_at: 10.days.ago)
|
||||
csat_3_days_ago = create(:csat_survey_response, account: account, created_at: 3.days.ago)
|
||||
|
||||
get "/api/v1/accounts/#{account.id}/csat_survey_responses",
|
||||
params: { since: 5.days.ago.to_time.to_i.to_s, until: Time.zone.today.to_time.to_i.to_s },
|
||||
headers: administrator.create_new_auth_token,
|
||||
as: :json
|
||||
|
||||
expect(response).to have_http_status(:success)
|
||||
response_data = JSON.parse(response.body)
|
||||
expect(response_data.pluck('id')).to include(csat_3_days_ago.id)
|
||||
expect(response_data.pluck('id')).not_to include(csat_10_days_ago.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
12
spec/factories/csat_survey_responses.rb
Normal file
12
spec/factories/csat_survey_responses.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
FactoryBot.define do
|
||||
factory :csat_survey_response do
|
||||
rating { 1 }
|
||||
feedback_message { Faker::Movie.quote }
|
||||
account
|
||||
conversation
|
||||
message
|
||||
contact
|
||||
end
|
||||
end
|
||||
36
spec/listeners/csat_survey_listener_spec.rb
Normal file
36
spec/listeners/csat_survey_listener_spec.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
require 'rails_helper'
|
||||
describe CsatSurveyListener do
|
||||
let(:listener) { described_class.instance }
|
||||
let!(:account) { create(:account) }
|
||||
let!(:user) { create(:user, account: account) }
|
||||
let!(:inbox) { create(:inbox, account: account) }
|
||||
let!(:conversation) { create(:conversation, account: account, inbox: inbox, assignee: user) }
|
||||
let!(:message) do
|
||||
create(
|
||||
:message, message_type: 'outgoing', account: account, inbox: inbox, conversation: conversation,
|
||||
content_type: :input_csat,
|
||||
content_attributes: { 'submitted_values': { 'csat_survey_response': { 'rating': 5, 'feedback_message': 'hello' } } }
|
||||
)
|
||||
end
|
||||
let!(:event) { Events::Base.new(event_name, Time.zone.now, message: message) }
|
||||
|
||||
describe '#message_updated' do
|
||||
let(:event_name) { 'message.updated' }
|
||||
let(:response_builder) { double }
|
||||
|
||||
context 'when CsatSurveys::ResponseBuilder' do
|
||||
it 'triggers if message is input csat' do
|
||||
expect(response_builder).to receive(:perform)
|
||||
expect(CsatSurveys::ResponseBuilder).to receive(:new).with(message: message).and_return(response_builder).once
|
||||
listener.message_updated(event)
|
||||
end
|
||||
|
||||
it 'will not trigger if message is not input csat' do
|
||||
message = create(:message)
|
||||
event = Events::Base.new(event_name, Time.zone.now, message: message)
|
||||
expect(CsatSurveys::ResponseBuilder).not_to receive(:new).with(message: message)
|
||||
listener.message_updated(event)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
28
spec/models/csat_survey_response_spec.rb
Normal file
28
spec/models/csat_survey_response_spec.rb
Normal file
@@ -0,0 +1,28 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe CsatSurveyResponse, type: :model do
|
||||
describe 'validations' do
|
||||
it { is_expected.to validate_presence_of(:rating) }
|
||||
it { is_expected.to validate_presence_of(:account_id) }
|
||||
it { is_expected.to validate_presence_of(:conversation_id) }
|
||||
it { is_expected.to validate_presence_of(:contact_id) }
|
||||
|
||||
it 'validates that the rating can only be in range 1-5' do
|
||||
csat_survey_response = build(:csat_survey_response, rating: 6)
|
||||
expect(csat_survey_response.valid?).to eq false
|
||||
end
|
||||
end
|
||||
|
||||
describe 'associations' do
|
||||
it { is_expected.to belong_to(:account) }
|
||||
it { is_expected.to belong_to(:conversation) }
|
||||
it { is_expected.to belong_to(:contact) }
|
||||
end
|
||||
|
||||
describe 'validates_factory' do
|
||||
it 'creates valid csat_survey_response object' do
|
||||
csat_survey_response = create(:csat_survey_response)
|
||||
expect(csat_survey_response.valid?).to eq true
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user