From 3e81b4d8e0111edfad416c594f29c38ce3414d8a Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 17 Dec 2025 18:06:16 +0530 Subject: [PATCH] feat: test rewrite service --- spec/lib/captain/rewrite_service_spec.rb | 146 +++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 spec/lib/captain/rewrite_service_spec.rb diff --git a/spec/lib/captain/rewrite_service_spec.rb b/spec/lib/captain/rewrite_service_spec.rb new file mode 100644 index 000000000..8364481c4 --- /dev/null +++ b/spec/lib/captain/rewrite_service_spec.rb @@ -0,0 +1,146 @@ +require 'rails_helper' + +RSpec.describe Captain::RewriteService do + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account) } + let(:conversation) { create(:conversation, account: account, inbox: inbox) } + let(:content) { 'I need help with my order' } + let(:event) do + { + 'name' => event_name, + 'data' => { + 'conversation_display_id' => conversation.display_id, + 'content' => content + } + } + end + let(:service) { described_class.new(account: account, event: event) } + let(:mock_chat) { instance_double(RubyLLM::Chat) } + let(:mock_context) { instance_double(RubyLLM::Context, chat: mock_chat) } + let(:mock_response) { instance_double(RubyLLM::Message, content: 'Rewritten text', input_tokens: 10, output_tokens: 5) } + + before do + create(:installation_config, name: 'CAPTAIN_OPEN_AI_API_KEY', value: 'test-key') + allow(Llm::Config).to receive(:with_api_key).and_yield(mock_context) + allow(mock_chat).to receive(:with_instructions) + allow(mock_chat).to receive(:ask).and_return(mock_response) + end + + describe '#fix_spelling_grammar_message' do + let(:event_name) { 'fix_spelling_grammar' } + + it 'uses fix_spelling_grammar prompt' do + expect(service).to receive(:prompt_from_file).with('fix_spelling_grammar').and_return('Fix errors') + + expect(service).to receive(:make_api_call) do |args| + expect(args[:messages][0][:content]).to eq('Fix errors') + expect(args[:messages][1][:content]).to eq(content) + { message: 'Fixed' } + end + + service.fix_spelling_grammar_message + end + end + + describe 'tone rewrite methods' do + let(:tone_prompt_template) { 'Rewrite in {{ tone }} tone' } + + before do + allow(service).to receive(:prompt_from_file).with('tone_rewrite').and_return(tone_prompt_template) + end + + describe '#casual_message' do + let(:event_name) { 'casual' } + + it 'uses casual tone' do + expect(service).to receive(:make_api_call) do |args| + expect(args[:messages][0][:content]).to eq('Rewrite in casual tone') + { message: 'Hey, need help?' } + end + + service.casual_message + end + end + + describe '#professional_message' do + let(:event_name) { 'professional' } + + it 'uses professional tone' do + expect(service).to receive(:make_api_call) do |args| + expect(args[:messages][0][:content]).to eq('Rewrite in professional tone') + { message: 'Professional text' } + end + + service.professional_message + end + end + + describe '#friendly_message' do + let(:event_name) { 'friendly' } + + it 'uses friendly tone' do + expect(service).to receive(:make_api_call) do |args| + expect(args[:messages][0][:content]).to eq('Rewrite in friendly tone') + { message: 'Friendly text' } + end + + service.friendly_message + end + end + + describe '#confident_message' do + let(:event_name) { 'confident' } + + it 'uses confident tone' do + expect(service).to receive(:make_api_call) do |args| + expect(args[:messages][0][:content]).to eq('Rewrite in confident tone') + { message: 'Confident text' } + end + + service.confident_message + end + end + + describe '#straightforward_message' do + let(:event_name) { 'straightforward' } + + it 'uses straightforward tone' do + expect(service).to receive(:make_api_call) do |args| + expect(args[:messages][0][:content]).to eq('Rewrite in straightforward tone') + { message: 'Straightforward text' } + end + + service.straightforward_message + end + end + end + + describe '#improve_message' do + let(:event_name) { 'improve' } + let(:improve_template) { 'Context: {{ conversation_context }}\nDraft: {{ draft_message }}' } + + before do + create(:message, conversation: conversation, message_type: :incoming, content: 'Customer message') + allow(service).to receive(:prompt_from_file).with('improve').and_return(improve_template) + end + + it 'uses conversation context and draft message with Liquid template' do + expect(service).to receive(:make_api_call) do |args| + system_content = args[:messages][0][:content] + + expect(system_content).to include('Context:') + expect(system_content).to include('Draft: I need help with my order') + expect(args[:messages][1][:content]).to eq(content) + { message: 'Improved text' } + end + + service.improve_message + end + + it 'returns formatted response' do + result = service.improve_message + + expect(result[:message]).to eq('Rewritten text') + end + end +end