require 'rails_helper' require 'models/application_model_examples' require 'models/concerns/can_be_imported_examples' require 'models/concerns/can_csv_import_examples' require 'models/concerns/has_history_examples' require 'models/concerns/has_object_manager_attributes_validation_examples' RSpec.describe Ticket::Article, type: :model do it_behaves_like 'ApplicationModel' it_behaves_like 'CanBeImported' it_behaves_like 'CanCsvImport' it_behaves_like 'HasHistory' it_behaves_like 'HasObjectManagerAttributesValidation' subject(:article) { create(:ticket_article) } describe 'Callbacks, Observers, & Async Transactions -' do describe 'NULL byte handling (via ChecksAttributeValuesAndLength concern):' do it 'removes them from #subject on creation, if necessary (postgres doesn’t like them)' do expect(create(:ticket_article, subject: "com test 1\u0000")) .to be_persisted end it 'removes them from #body on creation, if necessary (postgres doesn’t like them)' do expect(create(:ticket_article, body: "some\u0000message 123")) .to be_persisted end end describe 'Setting of ticket.create_article_{sender,type}' do let!(:ticket) { create(:ticket) } context 'on creation' do context 'of first article on a ticket' do subject(:article) do create(:ticket_article, ticket: ticket, sender_name: 'Agent', type_name: 'email') end it 'sets ticket sender/type attributes based on article sender/type' do expect { article } .to change { ticket.reload.create_article_sender&.name }.to('Agent') .and change { ticket.reload.create_article_type&.name }.to('email') end end context 'of subsequent articles on a ticket' do subject(:article) do create(:ticket_article, ticket: ticket, sender_name: 'Customer', type_name: 'twitter status') end let!(:first_article) do create(:ticket_article, ticket: ticket, sender_name: 'Agent', type_name: 'email') end it 'does not modify ticket’s sender/type attributes' do expect { article } .to not_change { ticket.reload.create_article_sender.name } .and not_change { ticket.reload.create_article_type.name } end end end end describe 'XSS protection:' do subject(:article) { create(:ticket_article, body: body, content_type: 'text/html') } context 'when body contains only injected JS' do let(:body) { <<~RAW.chomp } RAW it 'removes RAW it 'removes