move presentation to templates

This commit is contained in:
41666 2025-04-06 20:55:46 -07:00
parent 1c533926ca
commit d9146750ba
5 changed files with 70 additions and 69 deletions

View file

@ -1,31 +0,0 @@
package presentation_test
import (
"testing"
"git.sapphic.engineer/roleypoly/v4/presentation"
"git.sapphic.engineer/roleypoly/v4/types/fixtures"
"github.com/stretchr/testify/assert"
)
func TestRole(t *testing.T) {
r := presentation.Role(&fixtures.CategoryMulti, &fixtures.RoleWithDarkColor, true)
assert.Equal(t, fixtures.RoleWithDarkColor.ID, r.ID)
assert.Equal(t, fixtures.RoleWithDarkColor.Name, r.Name)
assert.Equal(t, presentation.InputCheckbox, r.InputType)
assert.Equal(t, "#a20000", r.Colors.Main)
assert.True(t, r.Selected)
r = presentation.Role(&fixtures.CategorySingle, &fixtures.RoleWithDarkColor, false)
assert.Equal(t, presentation.InputRadio, r.InputType)
assert.False(t, r.Selected)
r = presentation.Role(&fixtures.CategorySingle, &fixtures.RoleWithLightColor, true)
assert.True(t, r.Selected)
}
func TestGetColors(t *testing.T) {
c := presentation.GetColors(0xa20000)
assert.Equal(t, "#a20000", c.Main)
assert.Equal(t, "#ffd8d8", c.Alt)
}

View file

@ -1,10 +1,24 @@
package presentation package components
import ( import (
"git.sapphic.engineer/roleypoly/v4/types" "git.sapphic.engineer/roleypoly/v4/types"
"git.sapphic.engineer/roleypoly/v4/utils" "git.sapphic.engineer/roleypoly/v4/utils"
) )
type RoleTemplateData struct {
ID string
CategoryID string
Name string
Selected bool
InputType InputType
Colors RoleColors
}
type RoleColors struct {
Main string
Alt string
}
type InputType string type InputType string
const ( const (
@ -12,24 +26,15 @@ const (
InputRadio InputType = "radio" InputRadio InputType = "radio"
) )
type PresentableRole struct { func Role(category *types.Category, role *types.Role, selected bool) RoleTemplateData {
ID string
CategoryID string
Name string
Selected bool
InputType InputType
Colors PresentableRoleColors
}
func Role(category *types.Category, role *types.Role, selected bool) PresentableRole {
inputType := InputCheckbox inputType := InputCheckbox
if category.Type == types.CategorySingle { if category.Type == types.CategorySingle {
inputType = InputRadio inputType = InputRadio
} }
colors := GetColors(role.Color) colors := NewRoleColors(role.Color)
return PresentableRole{ return RoleTemplateData{
ID: role.ID, ID: role.ID,
CategoryID: category.ID, CategoryID: category.ID,
Name: role.Name, Name: role.Name,
@ -39,18 +44,13 @@ func Role(category *types.Category, role *types.Role, selected bool) Presentable
} }
} }
type PresentableRoleColors struct { func NewRoleColors(roleColor uint32) RoleColors {
Main string
Alt string
}
func GetColors(roleColor uint32) PresentableRoleColors {
// TODO: no color // TODO: no color
r, g, b := utils.IntToRgb(roleColor) r, g, b := utils.IntToRgb(roleColor)
altR, altG, altB := utils.AltColor(r, g, b) altR, altG, altB := utils.AltColor(r, g, b)
return PresentableRoleColors{ return RoleColors{
Main: utils.RgbToString(r, g, b), Main: utils.RgbToString(r, g, b),
Alt: utils.RgbToString(altR, altG, altB), Alt: utils.RgbToString(altR, altG, altB),
} }

View file

@ -4,23 +4,18 @@ import (
"fmt" "fmt"
"testing" "testing"
"git.sapphic.engineer/roleypoly/v4/presentation" "git.sapphic.engineer/roleypoly/v4/templates/components"
"git.sapphic.engineer/roleypoly/v4/templates/templatetesting" "git.sapphic.engineer/roleypoly/v4/templates/templatetesting"
"git.sapphic.engineer/roleypoly/v4/types"
"git.sapphic.engineer/roleypoly/v4/types/fixtures" "git.sapphic.engineer/roleypoly/v4/types/fixtures"
"git.sapphic.engineer/roleypoly/v4/utils" "git.sapphic.engineer/roleypoly/v4/utils"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func renderRole(t *testing.T, c *types.Category, r *types.Role, s bool) string { func TestRoleTemplate(t *testing.T) {
data := presentation.Role(c, r, s)
return templatetesting.Template(t, "components/role", data)
}
func TestRole(t *testing.T) {
c := &fixtures.CategoryMulti c := &fixtures.CategoryMulti
r := &fixtures.RoleWithDarkColor r := &fixtures.RoleWithDarkColor
html := renderRole(t, c, r, false) data := components.Role(c, r, true)
html := templatetesting.Template(t, "components/role", data)
assert.Contains(t, html, "--role-color: #a20000;", "role color is set") assert.Contains(t, html, "--role-color: #a20000;", "role color is set")
assert.Contains(t, html, `type="checkbox"`, "multi has input type=checkbox") assert.Contains(t, html, `type="checkbox"`, "multi has input type=checkbox")
assert.Contains(t, html, fmt.Sprintf("--contrast-color: %s;", utils.RgbToString(utils.AltColor(162, 0, 0))), "contrast color is set") assert.Contains(t, html, fmt.Sprintf("--contrast-color: %s;", utils.RgbToString(utils.AltColor(162, 0, 0))), "contrast color is set")
@ -31,10 +26,31 @@ func TestRole(t *testing.T) {
c = &fixtures.CategorySingle c = &fixtures.CategorySingle
r = &fixtures.RoleWithLightColor r = &fixtures.RoleWithLightColor
html = renderRole(t, c, r, true) data = components.Role(c, r, false)
html = templatetesting.Template(t, "components/role", data)
assert.Contains(t, html, `type="radio"`, "single has input type=radio") assert.Contains(t, html, `type="radio"`, "single has input type=radio")
assert.Contains(t, html, fmt.Sprintf("--contrast-color: %s;", utils.RgbToString(utils.AltColor(0xff, 0xaa, 0x88))), "contrast color") assert.Contains(t, html, fmt.Sprintf("--contrast-color: %s;", utils.RgbToString(utils.AltColor(0xff, 0xaa, 0x88))), "contrast color")
assert.Contains(t, html, fmt.Sprintf(`name="%s"`, utils.RoleInputName(c)), "single has name attr") assert.Contains(t, html, fmt.Sprintf(`name="%s"`, utils.RoleInputName(c)), "single has name attr")
} }
// TODO: these can probably be string utils that are injected as functions into template func TestRole(t *testing.T) {
r := components.Role(&fixtures.CategoryMulti, &fixtures.RoleWithDarkColor, true)
assert.Equal(t, fixtures.RoleWithDarkColor.ID, r.ID)
assert.Equal(t, fixtures.RoleWithDarkColor.Name, r.Name)
assert.Equal(t, components.InputCheckbox, r.InputType)
assert.Equal(t, "#a20000", r.Colors.Main)
assert.True(t, r.Selected)
r = components.Role(&fixtures.CategorySingle, &fixtures.RoleWithDarkColor, false)
assert.Equal(t, components.InputRadio, r.InputType)
assert.False(t, r.Selected)
r = components.Role(&fixtures.CategorySingle, &fixtures.RoleWithLightColor, true)
assert.True(t, r.Selected)
}
func TestNewRoleColors(t *testing.T) {
c := components.NewRoleColors(0xa20000)
assert.Equal(t, "#a20000", c.Main)
assert.Equal(t, "#ffd8d8", c.Alt)
}

View file

@ -0,0 +1,16 @@
package layouts_test
import (
"testing"
"git.sapphic.engineer/roleypoly/v4/templates/templatetesting"
"github.com/stretchr/testify/assert"
)
func TestMainLayout(t *testing.T) {
r := templatetesting.Template(t, "layouts/main", struct{ HeadTitle string }{HeadTitle: "roleypoly"})
assert.Contains(t, r, "%%EMBED%%", "has {{embed}}")
assert.Contains(t, r, "<nav>", "loaded navigation (open)")
assert.Contains(t, r, "</nav>", "loaded navigation (close)")
assert.Contains(t, r, "<title>roleypoly</title>", "sets title")
}

View file

@ -7,7 +7,7 @@ import (
"git.sapphic.engineer/roleypoly/v4/auth/authmiddleware" "git.sapphic.engineer/roleypoly/v4/auth/authmiddleware"
"git.sapphic.engineer/roleypoly/v4/discord" "git.sapphic.engineer/roleypoly/v4/discord"
"git.sapphic.engineer/roleypoly/v4/presentation" "git.sapphic.engineer/roleypoly/v4/templates/components"
"git.sapphic.engineer/roleypoly/v4/types" "git.sapphic.engineer/roleypoly/v4/types"
"git.sapphic.engineer/roleypoly/v4/types/fixtures" "git.sapphic.engineer/roleypoly/v4/types/fixtures"
) )
@ -39,12 +39,12 @@ func (t *TestingController) TestTemplate(c fiber.Ctx) error {
cat1 := fixtures.Category(fixtures.CategoryMulti) cat1 := fixtures.Category(fixtures.CategoryMulti)
cat2 := fixtures.Category(fixtures.CategorySingle) cat2 := fixtures.Category(fixtures.CategorySingle)
return c.Render("tests/"+which, fiber.Map{ return c.Render("tests/"+which, fiber.Map{
"TestRole": presentation.Role(cat1, &fixtures.RoleWithDarkColor, false), "TestRole": components.Role(cat1, &fixtures.RoleWithDarkColor, false),
"TestRole2": presentation.Role(cat1, &fixtures.RoleWithDarkMediumColor, false), "TestRole2": components.Role(cat1, &fixtures.RoleWithDarkMediumColor, false),
"TestRole3": presentation.Role(cat1, &fixtures.RoleWithLightColor, true), "TestRole3": components.Role(cat1, &fixtures.RoleWithLightColor, true),
"TestRole4": presentation.Role(cat1, &fixtures.RoleWithDarkColor, false), "TestRole4": components.Role(cat1, &fixtures.RoleWithDarkColor, false),
"TestRole5": presentation.Role(cat2, &fixtures.RoleWithLightColor, true), "TestRole5": components.Role(cat2, &fixtures.RoleWithLightColor, true),
"TestRole6": presentation.Role(cat1, &fixtures.RoleWithLightMediumColor, false), "TestRole6": components.Role(cat1, &fixtures.RoleWithLightMediumColor, false),
}, "layouts/main") }, "layouts/main")
} }