From 5604e5905909fa6aa01d2f0643f0b950dfd532a6 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 18 Jun 2025 19:25:06 +0530 Subject: [PATCH] test: processor service --- .../notion/processor_service_spec.rb | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 spec/lib/integrations/notion/processor_service_spec.rb diff --git a/spec/lib/integrations/notion/processor_service_spec.rb b/spec/lib/integrations/notion/processor_service_spec.rb new file mode 100644 index 000000000..38b3bdf06 --- /dev/null +++ b/spec/lib/integrations/notion/processor_service_spec.rb @@ -0,0 +1,145 @@ +require 'rails_helper' + +RSpec.describe Integrations::Notion::ProcessorService do + subject(:service) { described_class.new(account: account) } + + let(:account) { create(:account) } + let(:notion_hook) { create(:integrations_hook, account: account, app_id: 'notion', access_token: 'notion_token') } + let(:notion_client) { instance_double(Notion) } + + before do + notion_hook + allow(Notion).to receive(:new).with('notion_token').and_return(notion_client) + end + + describe '#search_pages' do + let(:query) { 'test query' } + let(:sort) { { direction: 'ascending', timestamp: 'last_edited_time' } } + + context 'when search is successful' do + let(:search_response) { { 'results' => [{ 'id' => '123', 'object' => 'page' }] } } + + before do + allow(notion_client).to receive(:search).with(query, sort).and_return(search_response) + end + + it 'returns formatted data' do + result = service.search_pages(query, sort) + expect(result).to eq([{ 'id' => '123', 'object' => 'page' }]) + end + end + + context 'when search fails' do + let(:error_response) { { error: 'API error', error_code: 400 } } + + before do + allow(notion_client).to receive(:search).with(query, sort).and_return(error_response) + end + + it 'returns error' do + result = service.search_pages(query, sort) + expect(result).to eq({ error: 'API error' }) + end + end + end + + describe '#page' do + let(:page_id) { 'page-123' } + + context 'when page retrieval is successful' do + let(:page_response) { { 'id' => page_id, 'object' => 'page' } } + + before do + allow(notion_client).to receive(:page).with(page_id).and_return(page_response) + end + + it 'returns formatted data' do + result = service.page(page_id) + expect(result).to eq({ 'id' => page_id, 'object' => 'page' }) + end + end + + context 'when page retrieval fails' do + let(:error_response) { { error: 'Page not found', error_code: 404 } } + + before do + allow(notion_client).to receive(:page).with(page_id).and_return(error_response) + end + + it 'returns error' do + result = service.page(page_id) + expect(result).to eq({ error: 'Page not found' }) + end + end + end + + describe '#page_md' do + let(:page_id) { 'page-123' } + + context 'when page blocks retrieval is successful' do + let(:blocks_response) do + { + 'results' => [ + { + 'type' => 'paragraph', + 'paragraph' => { + 'rich_text' => [{ 'plain_text' => 'Hello world' }] + } + } + ] + } + end + let(:markdown_converter) { instance_double(NotionToMarkdown) } + + before do + allow(notion_client).to receive(:page_blocks).with(page_id).and_return(blocks_response) + allow(NotionToMarkdown).to receive(:new).and_return(markdown_converter) + allow(markdown_converter).to receive(:convert).with(blocks_response['results']).and_return('Hello world') + end + + it 'returns markdown content' do + result = service.page_md(page_id) + expect(result).to eq('Hello world') + end + + it 'calls NotionToMarkdown converter with blocks' do + service.page_md(page_id) + expect(markdown_converter).to have_received(:convert).with(blocks_response['results']) + end + end + + context 'when page blocks retrieval fails' do + let(:error_response) { { error: 'Page not found', error_code: 404 } } + + before do + allow(notion_client).to receive(:page_blocks).with(page_id).and_return(error_response) + end + + it 'returns error' do + result = service.page_md(page_id) + expect(result).to eq({ error: 'Page not found' }) + end + end + end + + describe 'private methods' do + describe '#notion_hook' do + it 'finds the notion hook for the account' do + expect(service.send(:notion_hook)).to eq(notion_hook) + end + + it 'raises error if hook not found' do + notion_hook.destroy! + expect { service.send(:notion_hook) }.to raise_error(ActiveRecord::RecordNotFound) + end + end + + describe '#notion_client' do + it 'creates a Notion client with the hook access token' do + client = service.send(:notion_client) + expect(Notion).to have_received(:new).with('notion_token') + expect(client).to eq(notion_client) + end + end + end +end \ No newline at end of file