Files
chatwoot/spec/controllers/public/api/v1/inbox/contacts_controller_spec.rb
Vishnu NarayananandGitHub 20227403ce fix: return public contact inbox payload after update (#14946)
# Pull Request Template

## Description
This keeps the public inbox contact update response on the public
contact inbox serializer shape after applying the contact identify
update.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- [ ] This change requires a documentation update

## How Has This Been Tested?

- `bundle exec rspec
spec/controllers/public/api/v1/inbox/contacts_controller_spec.rb`

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

Fixes
[https://linear.app/chatwoot/issue/CW-6937](https://linear.app/chatwoot/issue/CW-6937)
Fixes
[https://linear.app/chatwoot/issue/CW-7464](https://linear.app/chatwoot/issue/CW-7464)
Fixes
[https://linear.app/chatwoot/issue/CW-7457](https://linear.app/chatwoot/issue/CW-7457)
2026-07-09 13:50:01 +05:30

64 lines
2.7 KiB
Ruby

require 'rails_helper'
RSpec.describe 'Public Inbox Contacts API', type: :request do
let!(:api_channel) { create(:channel_api) }
let!(:contact) { create(:contact) }
let!(:contact_inbox) { create(:contact_inbox, contact: contact, inbox: api_channel.inbox) }
describe 'POST /public/api/v1/inboxes/{identifier}/contact' do
it 'creates a contact and return the source id' do
post "/public/api/v1/inboxes/#{api_channel.identifier}/contacts"
expect(response).to have_http_status(:success)
data = response.parsed_body
expect(data.keys).to include('email', 'id', 'name', 'phone_number', 'pubsub_token', 'source_id')
expect(data['source_id']).not_to be_nil
expect(data['pubsub_token']).not_to be_nil
end
it 'persists the identifier of the contact' do
identifier = 'contact-identifier'
post "/public/api/v1/inboxes/#{api_channel.identifier}/contacts", params: { identifier: identifier }
expect(response).to have_http_status(:success)
db_contact = api_channel.account.contacts.find_by(identifier: identifier)
expect(db_contact).not_to be_nil
end
end
describe 'GET /public/api/v1/inboxes/{identifier}/contact/{source_id}' do
it 'gets a contact when present' do
get "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}"
expect(response).to have_http_status(:success)
data = response.parsed_body
expect(data.keys).to include('email', 'id', 'name', 'phone_number', 'pubsub_token', 'source_id')
expect(data['source_id']).to eq contact_inbox.source_id
expect(data['pubsub_token']).to eq contact_inbox.pubsub_token
end
end
describe 'PATCH /public/api/v1/inboxes/{identifier}/contact/{source_id}' do
it 'updates a contact when present' do
patch "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}",
params: { name: 'John Smith' }
expect(response).to have_http_status(:success)
data = response.parsed_body
expect(data['name']).to eq 'John Smith'
end
it 'does not expose internal contact columns' do
contact.update!(identifier: 'contact-identifier', custom_attributes: { tier: 'vip' }, additional_attributes: { company_name: 'Acme' })
patch "/public/api/v1/inboxes/#{api_channel.identifier}/contacts/#{contact_inbox.source_id}",
params: { name: 'John Smith' }
expect(response).to have_http_status(:success)
data = response.parsed_body
expect(data.keys).to include('email', 'id', 'name', 'phone_number', 'pubsub_token', 'source_id')
expect(data.keys).not_to include('account_id', 'identifier', 'custom_attributes', 'additional_attributes', 'company_id')
end
end
end