test: notion presenter
This commit is contained in:
@@ -0,0 +1,204 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe NotionPagePresenter do
|
||||||
|
subject(:presenter) { described_class.new(page_response, blocks_response) }
|
||||||
|
|
||||||
|
let(:page_response) do
|
||||||
|
{
|
||||||
|
'id' => 'page-123',
|
||||||
|
'icon' => { 'emoji' => '📄' },
|
||||||
|
'created_time' => '2023-01-01T10:00:00.000Z',
|
||||||
|
'last_edited_time' => '2023-01-02T15:30:00.000Z',
|
||||||
|
'properties' => {
|
||||||
|
'title' => {
|
||||||
|
'type' => 'title',
|
||||||
|
'title' => [
|
||||||
|
{ 'plain_text' => 'Test Page Title' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:blocks_response) do
|
||||||
|
{
|
||||||
|
'results' => [
|
||||||
|
{
|
||||||
|
'type' => 'paragraph',
|
||||||
|
'paragraph' => {
|
||||||
|
'rich_text' => [
|
||||||
|
{ 'plain_text' => 'This is a paragraph.' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'type' => 'child_page',
|
||||||
|
'id' => 'child-page-1',
|
||||||
|
'child_page' => {
|
||||||
|
'title' => 'Child Page 1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:markdown_converter) { instance_double(NotionToMarkdown) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(NotionToMarkdown).to receive(:new).and_return(markdown_converter)
|
||||||
|
allow(markdown_converter).to receive(:convert).and_return('This is a paragraph.')
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#to_hash' do
|
||||||
|
it 'returns a properly formatted hash with all required fields' do
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result).to include(
|
||||||
|
'id' => 'page-123',
|
||||||
|
'icon' => { 'emoji' => '📄' },
|
||||||
|
'title' => 'Test Page Title',
|
||||||
|
'created_time' => '2023-01-01T10:00:00.000Z',
|
||||||
|
'last_edited_time' => '2023-01-02T15:30:00.000Z'
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'includes markdown content with title as H1' do
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result['md']).to eq("# Test Page Title\n\nThis is a paragraph.")
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'includes child pages with id and title' do
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result['child_pages']).to eq([
|
||||||
|
{
|
||||||
|
'id' => 'child-page-1',
|
||||||
|
'title' => 'Child Page 1'
|
||||||
|
}
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calls NotionToMarkdown converter with blocks' do
|
||||||
|
presenter.to_hash
|
||||||
|
|
||||||
|
expect(markdown_converter).to have_received(:convert).with(blocks_response['results'])
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when page has no title in properties' do
|
||||||
|
let(:page_response) do
|
||||||
|
{
|
||||||
|
'id' => 'page-123',
|
||||||
|
'icon' => nil,
|
||||||
|
'created_time' => '2023-01-01T10:00:00.000Z',
|
||||||
|
'last_edited_time' => '2023-01-02T15:30:00.000Z',
|
||||||
|
'properties' => {}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns nil for title and no H1 in markdown' do
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result['title']).to be_nil
|
||||||
|
expect(result['md']).to eq('This is a paragraph.')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when page has no properties' do
|
||||||
|
let(:page_response) do
|
||||||
|
{
|
||||||
|
'id' => 'page-123',
|
||||||
|
'icon' => nil,
|
||||||
|
'created_time' => '2023-01-01T10:00:00.000Z',
|
||||||
|
'last_edited_time' => '2023-01-02T15:30:00.000Z'
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns nil for title' do
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result['title']).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with nested child pages' do
|
||||||
|
let(:blocks_response) do
|
||||||
|
{
|
||||||
|
'results' => [
|
||||||
|
{
|
||||||
|
'type' => 'toggle',
|
||||||
|
'has_children' => true,
|
||||||
|
'children' => [
|
||||||
|
{
|
||||||
|
'type' => 'child_page',
|
||||||
|
'id' => 'nested-child-1',
|
||||||
|
'child_page' => {
|
||||||
|
'title' => 'Nested Child Page'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'type' => 'child_page',
|
||||||
|
'id' => 'top-level-child',
|
||||||
|
'child_page' => {
|
||||||
|
'title' => 'Top Level Child'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'extracts all child pages including nested ones' do
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result['child_pages']).to contain_exactly(
|
||||||
|
{
|
||||||
|
'id' => 'nested-child-1',
|
||||||
|
'title' => 'Nested Child Page'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'id' => 'top-level-child',
|
||||||
|
'title' => 'Top Level Child'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when blocks response has no child pages' do
|
||||||
|
let(:blocks_response) do
|
||||||
|
{
|
||||||
|
'results' => [
|
||||||
|
{
|
||||||
|
'type' => 'paragraph',
|
||||||
|
'paragraph' => {
|
||||||
|
'rich_text' => [
|
||||||
|
{ 'plain_text' => 'Just a paragraph.' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns empty child_pages array' do
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result['child_pages']).to eq([])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when blocks response is empty' do
|
||||||
|
let(:blocks_response) { { 'results' => [] } }
|
||||||
|
|
||||||
|
it 'handles empty blocks gracefully' do
|
||||||
|
allow(markdown_converter).to receive(:convert).with([]).and_return('')
|
||||||
|
|
||||||
|
result = presenter.to_hash
|
||||||
|
|
||||||
|
expect(result['md']).to eq("# Test Page Title\n\n")
|
||||||
|
expect(result['child_pages']).to eq([])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user