feat: Add CSAT response APIs (#2503)

Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
This commit is contained in:
Sojan Jose
2021-06-29 20:59:41 +05:30
committed by GitHub
parent 2e71006f9d
commit dd9d5e410c
28 changed files with 358 additions and 23 deletions

View 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

View File

@@ -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

View File

@@ -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

View 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

View 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

View 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