Skip to content

Commit

Permalink
Add DownloadableFileBlock interface for Pdf, File, and Image blocks
Browse files Browse the repository at this point in the history
This change:
- Adds new interface to unify common functionality
- Implements interface for PdfBlock, FileBlock, and ImageBlock
- Adds comprehensive test coverage
  • Loading branch information
aydinomer00 authored and jomei committed Dec 20, 2024
1 parent 6609d69 commit f2cb9bd
Show file tree
Hide file tree
Showing 2 changed files with 195 additions and 0 deletions.
69 changes: 69 additions & 0 deletions downloadable_interface.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package notionapi

import "time"

// DownloadableFileBlock is an interface for blocks that can be downloaded
// such as Pdf, FileBlock, and Image
type DownloadableFileBlock interface {
Block
GetURL() string
GetExpiryTime() *time.Time
}

// GetURL implements DownloadableFileBlock interface for PdfBlock
func (b *PdfBlock) GetURL() string {
if b.Pdf.File != nil {
return b.Pdf.File.URL
}
if b.Pdf.External != nil {
return b.Pdf.External.URL
}
return ""
}

// GetExpiryTime implements DownloadableFileBlock interface for PdfBlock
func (b *PdfBlock) GetExpiryTime() *time.Time {
if b.Pdf.File != nil {
return b.Pdf.File.ExpiryTime
}
return nil
}

// GetURL implements DownloadableFileBlock interface for FileBlock
func (b *FileBlock) GetURL() string {
if b.File.File != nil {
return b.File.File.URL
}
if b.File.External != nil {
return b.File.External.URL
}
return ""
}

// GetExpiryTime implements DownloadableFileBlock interface for FileBlock
func (b *FileBlock) GetExpiryTime() *time.Time {
if b.File.File != nil {
return b.File.File.ExpiryTime
}
return nil
}

// GetURL implements DownloadableFileBlock interface for ImageBlock
func (b *ImageBlock) GetURL() string {
return b.Image.GetURL()
}

// GetExpiryTime implements DownloadableFileBlock interface for ImageBlock
func (b *ImageBlock) GetExpiryTime() *time.Time {
if b.Image.File != nil {
return b.Image.File.ExpiryTime
}
return nil
}

// Verify that types implement DownloadableFileBlock interface
var (
_ DownloadableFileBlock = (*PdfBlock)(nil)
_ DownloadableFileBlock = (*FileBlock)(nil)
_ DownloadableFileBlock = (*ImageBlock)(nil)
)
126 changes: 126 additions & 0 deletions downloadable_interface_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package notionapi

import (
"testing"
"time"
)

func TestPdfBlockImplementsDownloadableFileBlock(t *testing.T) {
// Test setup
now := time.Now()
pdfBlock := &PdfBlock{
Pdf: Pdf{
File: &FileObject{
URL: "https://example.com/file.pdf",
ExpiryTime: &now,
},
},
}

// Test GetURL
if url := pdfBlock.GetURL(); url != "https://example.com/file.pdf" {
t.Errorf("Expected URL to be 'https://example.com/file.pdf', got %s", url)
}

// Test GetExpiryTime
if expiry := pdfBlock.GetExpiryTime(); expiry != &now {
t.Errorf("Expected expiry time to be %v, got %v", now, expiry)
}
}

func TestFileBlockImplementsDownloadableFileBlock(t *testing.T) {
// Test setup
now := time.Now()
fileBlock := &FileBlock{
File: BlockFile{
File: &FileObject{
URL: "https://example.com/file.txt",
ExpiryTime: &now,
},
},
}

// Test GetURL
if url := fileBlock.GetURL(); url != "https://example.com/file.txt" {
t.Errorf("Expected URL to be 'https://example.com/file.txt', got %s", url)
}

// Test GetExpiryTime
if expiry := fileBlock.GetExpiryTime(); expiry != &now {
t.Errorf("Expected expiry time to be %v, got %v", now, expiry)
}
}

func TestImageBlockImplementsDownloadableFileBlock(t *testing.T) {
// Test setup
now := time.Now()
imageBlock := &ImageBlock{
Image: Image{
File: &FileObject{
URL: "https://example.com/image.jpg",
ExpiryTime: &now,
},
},
}

// Test GetURL
if url := imageBlock.GetURL(); url != "https://example.com/image.jpg" {
t.Errorf("Expected URL to be 'https://example.com/image.jpg', got %s", url)
}

// Test GetExpiryTime
if expiry := imageBlock.GetExpiryTime(); expiry != &now {
t.Errorf("Expected expiry time to be %v, got %v", now, expiry)
}
}

func TestExternalURLCases(t *testing.T) {
// Test External URLs for each block type
testCases := []struct {
name string
block DownloadableFileBlock
expected string
}{
{
name: "PDF with external URL",
block: &PdfBlock{
Pdf: Pdf{
External: &FileObject{
URL: "https://external.com/file.pdf",
},
},
},
expected: "https://external.com/file.pdf",
},
{
name: "File with external URL",
block: &FileBlock{
File: BlockFile{
External: &FileObject{
URL: "https://external.com/file.txt",
},
},
},
expected: "https://external.com/file.txt",
},
{
name: "Image with external URL",
block: &ImageBlock{
Image: Image{
External: &FileObject{
URL: "https://external.com/image.jpg",
},
},
},
expected: "https://external.com/image.jpg",
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
if url := tc.block.GetURL(); url != tc.expected {
t.Errorf("Expected URL to be '%s', got '%s'", tc.expected, url)
}
})
}
}

0 comments on commit f2cb9bd

Please sign in to comment.