Skip to content
Snippets Groups Projects
Commit 27128e5c0b24 authored by Christophe de Vienne's avatar Christophe de Vienne
Browse files

api: return friendly errors on template loading

parent 2c15f4f87eb5
No related branches found
Tags 16.0.0
No related merge requests found
...@@ -2,8 +2,9 @@ ...@@ -2,8 +2,9 @@
import ( import (
"context" "context"
"fmt"
"reflect" "reflect"
"github.com/orus-io/mustache" "github.com/orus-io/mustache"
"github.com/rs/zerolog" "github.com/rs/zerolog"
...@@ -5,8 +6,9 @@ ...@@ -5,8 +6,9 @@
"reflect" "reflect"
"github.com/orus-io/mustache" "github.com/orus-io/mustache"
"github.com/rs/zerolog" "github.com/rs/zerolog"
redner "orus.io/orus-io/rednerd/lib"
"orus.io/orus-io/rednerd/models" "orus.io/orus-io/rednerd/models"
"orus.io/orus-io/rednerd/rendering" "orus.io/orus-io/rednerd/rendering"
) )
...@@ -32,7 +34,7 @@ ...@@ -32,7 +34,7 @@
bodyTemplate, err := mustache.ParseString(s) bodyTemplate, err := mustache.ParseString(s)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("%w: %w", redner.ErrInvalidInput, err)
} }
t := Template{ t := Template{
...@@ -45,7 +47,7 @@ ...@@ -45,7 +47,7 @@
for name, meta := range template.Metadata { for name, meta := range template.Metadata {
tmpl, err := mustache.ParseString(meta) tmpl, err := mustache.ParseString(meta)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("%w: metadata %s: %w", redner.ErrInvalidInput, name, err)
} }
t.metadataTemplates[name] = tmpl t.metadataTemplates[name] = tmpl
......
...@@ -187,6 +187,10 @@ ...@@ -187,6 +187,10 @@
ctx, r.registry, template, metadata, toType, ctx, r.registry, template, metadata, toType,
) )
if err != nil { if err != nil {
if errors.Is(err, ErrInvalidInput) {
return nil, models.NewRenderFailedError(err, nil)
}
if errors.Is(err, rendering.ErrUnknownTemplateLanguage) { if errors.Is(err, rendering.ErrUnknownTemplateLanguage) {
return nil, fmt.Errorf("%w: unknown template language: %s", ErrInvalidInput, template.Language) return nil, fmt.Errorf("%w: unknown template language: %s", ErrInvalidInput, template.Language)
} }
......
...@@ -22,6 +22,31 @@ ...@@ -22,6 +22,31 @@
tester.CreateUser("janedoe", "janedoe") tester.CreateUser("janedoe", "janedoe")
tester.Login("janedoe", "janedoe") tester.Login("janedoe", "janedoe")
t.Run("Mustache-parse-errors", func(t *testing.T) {
defer tester.SetT(t)()
var result models.RenderFailedError
tester.RenderExpectingError(
&models.RenderRequest{
Accept: "text/html",
Template: &models.Template{
Language: "mustache",
Produces: "text/plain",
BodyFormat: "text",
Body: "{{#toto}} {{/titi}}",
},
Data: models.Dataset{
apitester.JSONObj{"name": "Nath"},
},
},
&result,
)
assert.Equal(t, "invalid input: line 1: interleaved closing tag: titi", result.Message)
assert.Len(t, result.Details, 0)
})
t.Run("MJML-Template-to-html", func(t *testing.T) { t.Run("MJML-Template-to-html", func(t *testing.T) {
defer tester.SetT(t)() defer tester.SetT(t)()
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
"net/http" "net/http"
"github.com/k3a/html2text" "github.com/k3a/html2text"
"github.com/steinfletcher/apitest"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"orus.io/orus-io/rednerd/models" "orus.io/orus-io/rednerd/models"
...@@ -48,8 +49,22 @@ ...@@ -48,8 +49,22 @@
r.JSON(response) r.JSON(response)
} }
func (tester *APITester) renderRequest(
data *models.RenderRequest,
) *apitest.Response {
apitest := tester.APITest("render")
if tester.debug {
apitest = apitest.Debug()
}
return apitest.
Post("/api/v1/render/").
JSON(data).
Expect(tester.t)
}
// Render renders some data and returns a document. // Render renders some data and returns a document.
func (tester *APITester) Render( func (tester *APITester) Render(
data *models.RenderRequest, data *models.RenderRequest,
result *[]*models.Document, result *[]*models.Document,
) { ) {
...@@ -51,10 +66,11 @@ ...@@ -51,10 +66,11 @@
// Render renders some data and returns a document. // Render renders some data and returns a document.
func (tester *APITester) Render( func (tester *APITester) Render(
data *models.RenderRequest, data *models.RenderRequest,
result *[]*models.Document, result *[]*models.Document,
) { ) {
apitest := tester.APITest("render") tester.renderRequest(data).
if tester.debug { Status(http.StatusOK).
apitest = apitest.Debug() End().
} JSON(result)
}
...@@ -60,11 +76,12 @@ ...@@ -60,11 +76,12 @@
r := apitest. func (tester *APITester) RenderExpectingError(
Post("/api/v1/render/"). data *models.RenderRequest,
JSON(data). err *models.RenderFailedError,
Expect(tester.t). ) {
Status(http.StatusOK). tester.renderRequest(data).
End() Status(http.StatusBadRequest).
r.JSON(result) End().
JSON(err)
} }
// Renderlogs gives us a csv document containing the // Renderlogs gives us a csv document containing the
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment