Skip to content

Commit

Permalink
feature/load fonts as byte streams (#411)
Browse files Browse the repository at this point in the history
* Add AddUTF8FontFromBytes to repository

Allow to provide font files as Byte streams directly instead of
loading from file. This is specially useful when using `go:embed` to
include the asset files in the binary generating the PDFs.

* fixup! Add AddUTF8FontFromBytes to repository

* Use assert.Len instead of Equal
  • Loading branch information
miguelbernadi authored May 1, 2024
1 parent 4f5e446 commit a65b707
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 4 deletions.
5 changes: 5 additions & 0 deletions mocks/Repository.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions pkg/repository/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
// Repository is the abstraction to load custom fonts.
type Repository interface {
AddUTF8Font(family string, style fontstyle.Type, file string) Repository
AddUTF8FontFromBytes(family string, style fontstyle.Type, bytes []byte) Repository
Load() ([]*entity.CustomFont, error)
}

Expand Down Expand Up @@ -46,9 +47,35 @@ func (r *FontRepository) AddUTF8Font(family string, style fontstyle.Type, file s
return r
}

// AddUTF8FontFromBytes adds a custom font to the repository from a byte slice.
func (r *FontRepository) AddUTF8FontFromBytes(family string, style fontstyle.Type, bytes []byte) Repository {
if family == "" {
return r
}

if !style.IsValid() {
return r
}

if bytes == nil {
return r
}

r.customFonts = append(r.customFonts, &entity.CustomFont{
Family: family,
Style: style,
Bytes: bytes,
})

return r
}

// Load loads all custom fonts.
func (r *FontRepository) Load() ([]*entity.CustomFont, error) {
for _, customFont := range r.customFonts {
if customFont.File == "" {
continue
}
bytes, err := os.ReadFile(customFont.File)
if err != nil {
return nil, err
Expand Down
65 changes: 61 additions & 4 deletions pkg/repository/repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (

"github.com/johnfercher/maroto/v2/pkg/consts/fontstyle"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestRepository_AddUTF8Font(t *testing.T) {
Expand All @@ -22,7 +23,7 @@ func TestRepository_AddUTF8Font(t *testing.T) {

// Assert
assert.Nil(t, err)
assert.Equal(t, 0, len(customFonts))
assert.Len(t, customFonts, 0)
})

t.Run("when fontstyle style is invalid, should not add value", func(t *testing.T) {
Expand All @@ -34,7 +35,7 @@ func TestRepository_AddUTF8Font(t *testing.T) {

// Assert
assert.Nil(t, err)
assert.Equal(t, 0, len(customFonts))
assert.Len(t, customFonts, 0)
})

t.Run("when fontstyle file is empty, should not add value", func(t *testing.T) {
Expand All @@ -46,7 +47,7 @@ func TestRepository_AddUTF8Font(t *testing.T) {

// Assert
assert.Nil(t, err)
assert.Equal(t, 0, len(customFonts))
assert.Len(t, customFonts, 0)
})

t.Run("when fontstyle is valid, should not value", func(t *testing.T) {
Expand All @@ -58,14 +59,70 @@ func TestRepository_AddUTF8Font(t *testing.T) {

// Assert
assert.Nil(t, err)
assert.Equal(t, 1, len(customFonts))
assert.Len(t, customFonts, 1)
assert.Equal(t, "family", customFonts[0].Family)
assert.Equal(t, fontstyle.Bold, customFonts[0].Style)
assert.NotEmpty(t, customFonts[0].File)
assert.NotEmpty(t, customFonts[0].Bytes)
})
}

func TestRepository_AddUTF8FontFromBytes(t *testing.T) {
t.Run("when fontstyle family is empty, should not add value", func(t *testing.T) {
// Arrange
sut := repository.New()

// Act
customFonts, err := sut.AddUTF8FontFromBytes("", fontstyle.Bold, []byte(``)).Load()

// Assert
assert.Nil(t, err)
assert.Len(t, customFonts, 0)
})

t.Run("when fontstyle style is invalid, should not add value", func(t *testing.T) {
// Arrange
sut := repository.New()

// Act
customFonts, err := sut.AddUTF8FontFromBytes("family", "invalid", []byte(``)).Load()

// Assert
assert.Nil(t, err)
assert.Len(t, customFonts, 0)
})

t.Run("when fontstyle bytes is nil, should not add value", func(t *testing.T) {
// Arrange
sut := repository.New()

// Act
customFonts, err := sut.AddUTF8FontFromBytes("family", fontstyle.Bold, nil).Load()

// Assert
assert.Nil(t, err)
assert.Len(t, customFonts, 0)
})

t.Run("when fontstyle is valid, should not value", func(t *testing.T) {
// Arrange
sut := repository.New()
ttf, err := os.ReadFile(buildPath("/docs/assets/fonts/arial-unicode-ms.ttf"))
require.NoError(t, err)

// Act
customFonts, err := sut.AddUTF8FontFromBytes("family", fontstyle.Bold, ttf).Load()

// Assert
assert.Nil(t, err)
assert.Len(t, customFonts, 1)
assert.Equal(t, "family", customFonts[0].Family)
assert.Equal(t, fontstyle.Bold, customFonts[0].Style)
assert.Empty(t, customFonts[0].File)
assert.NotEmpty(t, customFonts[0].Bytes)
})
}

func buildPath(file string) string {
dir, err := os.Getwd()
if err != nil {
Expand Down

0 comments on commit a65b707

Please sign in to comment.