CI / test (push) Failing after 38s
- Beranda: kolom tengah CTA 'masuk workspace' (klikable), strip Disclaimer dan Info aplikasi (versi/repo/config); geometri satu sumber (homeGeom). - Workspace: baris toolbar — pill Cari (klik atau '/' → cari-lompat daftar) + tombol [+ stack]/[konversi] klikable (sementara keduanya jalur konverter). - Detail kontainer: kolom kanan 'Aksi Tab' (mock TAB ACTION) berisi aksi tab aktif yang bisa diklik; disembunyikan di layar sempit agar tab bar utuh. - Footer: hint aksi diprioritaskan; status diagnostik dibuang bila tak muat. - internal/version: versi build dipakai CLI & strip Info aplikasi. - audio: Play/Status aman untuk Engine nil (Model zero-value di tes). - Tes: 3 skenario E2E baru (CTA, cari toolbar, kolom aksi) + tes layout.
71 lines
2.2 KiB
Go
71 lines
2.2 KiB
Go
package app
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"charm.land/lipgloss/v2"
|
|
|
|
"gitea.oxpoe.qzz.io/oxpoe/tia-love/internal/docker"
|
|
"gitea.oxpoe.qzz.io/oxpoe/tia-love/internal/i18n"
|
|
)
|
|
|
|
// TestDetailWidths — kolom aksi tab tampil hanya bila layar cukup lebar
|
|
// (tab bar detail tetap utuh di layar sempit).
|
|
func TestDetailWidths(t *testing.T) {
|
|
m := Model{width: 120, section: sectionContainers}
|
|
wDetail, wAct := m.detailWidths()
|
|
if wAct == 0 {
|
|
t.Fatalf("layar 120: kolom aksi harus tampil (wDetail=%d)", wDetail)
|
|
}
|
|
if wDetail+wAct != 120-m.leftWidth() {
|
|
t.Fatalf("layar 120: lebar tidak menjumlah (wDetail=%d wAct=%d)", wDetail, wAct)
|
|
}
|
|
m.width = 80
|
|
if _, wAct = m.detailWidths(); wAct != 0 {
|
|
t.Fatalf("layar 80: kolom aksi harus disembunyikan, dapat %d", wAct)
|
|
}
|
|
}
|
|
|
|
// TestToolbarPlain — toolbar workspace memuat pill cari + tombol stack,
|
|
// menampilkan query saat mode cari, dan tidak melebihi lebar layar.
|
|
func TestToolbarPlain(t *testing.T) {
|
|
m := Model{width: 80, view: viewList}
|
|
line := m.toolbarPlain()
|
|
if !strings.Contains(line, "[ / "+i18n.T("toolbar.search")+" ]") {
|
|
t.Fatalf("pill cari tidak ada: %q", line)
|
|
}
|
|
if !strings.Contains(line, i18n.T("toolbar.addStack")) || !strings.Contains(line, i18n.T("toolbar.convert")) {
|
|
t.Fatalf("tombol stack/konversi tidak ada: %q", line)
|
|
}
|
|
if w := lipgloss.Width(line); w > 80 {
|
|
t.Fatalf("toolbar melebihi lebar layar: %d", w)
|
|
}
|
|
m.searching, m.query = true, "abc"
|
|
if !strings.Contains(m.toolbarPlain(), "/ abc") {
|
|
t.Fatalf("query tidak tampil di pill: %q", m.toolbarPlain())
|
|
}
|
|
}
|
|
|
|
// TestSearchJump — pencarian melompat ke item pertama yang cocok (daftar tetap
|
|
// utuh), dan nama item mengikuti seksi aktif.
|
|
func TestSearchJump(t *testing.T) {
|
|
m := Model{
|
|
section: sectionContainers,
|
|
containers: []docker.Container{{Name: "alfa"}, {Name: "beta"}, {Name: "betawi"}},
|
|
}
|
|
m.query = "beta"
|
|
m.searchJumpCmd()
|
|
if got := m.cur(); got != 1 {
|
|
t.Fatalf("kursor = %d, mau 1 (kecocokan pertama)", got)
|
|
}
|
|
if m.itemName(2) != "betawi" {
|
|
t.Fatalf("itemName(2) = %q", m.itemName(2))
|
|
}
|
|
m.query = "tidak-ada"
|
|
m.searchJumpCmd()
|
|
if got := m.cur(); got != 1 {
|
|
t.Fatalf("tanpa kecocokan kursor harus tetap: %d", got)
|
|
}
|
|
}
|