193 lines
5.4 KiB
Go
193 lines
5.4 KiB
Go
package mujica
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/egoist/mygo/ui"
|
|
)
|
|
|
|
type shareProbe struct {
|
|
open bool
|
|
members []ShareMember
|
|
disabled bool
|
|
invites []ShareInvite
|
|
changed []string
|
|
removed []string
|
|
copied int
|
|
}
|
|
|
|
func newShareProbe() *shareProbe {
|
|
return &shareProbe{open: true, members: []ShareMember{
|
|
{ID: "o", Name: "Ada Lovelace", Email: "ada@court.org", Permission: PermissionEdit, Owner: true},
|
|
{ID: "b", Name: "Blaise Pascal", Email: "blaise@court.org", Permission: PermissionView},
|
|
}}
|
|
}
|
|
|
|
func (p *shareProbe) view(c *ui.Context) {
|
|
Use(c, Settings{})
|
|
r := ShareDialog(c, &p.open, &p.members, ShareDialogOptions{Title: "Ledger", Link: "https://court.org/ledger", Disabled: p.disabled})
|
|
if r.Invited != nil {
|
|
p.invites = append(p.invites, *r.Invited)
|
|
}
|
|
if r.Changed != "" {
|
|
p.changed = append(p.changed, r.Changed)
|
|
}
|
|
if r.Removed != "" {
|
|
p.removed = append(p.removed, r.Removed)
|
|
}
|
|
if r.Copied {
|
|
p.copied++
|
|
}
|
|
}
|
|
|
|
func TestShareDialogInvite(t *testing.T) {
|
|
p := newShareProbe()
|
|
tt := ui.NewTester(p.view, 640, 520)
|
|
if !tt.HasText("Share “Ledger”") || !tt.HasText("Owner") {
|
|
t.Fatalf("texts %q", tt.Texts())
|
|
}
|
|
for !tt.Focused("Email to invite") {
|
|
tt.Key(0, ui.KeyTab)
|
|
}
|
|
tt.Type("carl@court.org")
|
|
tt.Key(0, ui.KeyEnter)
|
|
if len(p.invites) != 1 || p.invites[0] != (ShareInvite{"carl@court.org", PermissionView}) {
|
|
t.Fatalf("invites %v", p.invites)
|
|
}
|
|
}
|
|
|
|
func TestShareDialogChangeRemoveCopy(t *testing.T) {
|
|
p := newShareProbe()
|
|
tt := ui.NewTester(p.view, 640, 520)
|
|
if err := tt.Click("Copy link"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if p.copied != 1 || tt.Clipboard() != "https://court.org/ledger" {
|
|
t.Fatalf("copied %d clipboard %q", p.copied, tt.Clipboard())
|
|
}
|
|
if err := tt.Click("Remove Blaise Pascal"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(p.removed) != 1 || len(p.members) != 1 || tt.HasText("Blaise Pascal") {
|
|
t.Fatalf("removed %v members %v", p.removed, p.members)
|
|
}
|
|
if tt.HasText("Remove Ada Lovelace") {
|
|
t.Fatal("owner can be removed")
|
|
}
|
|
}
|
|
|
|
func TestShareDialogPermissionChange(t *testing.T) {
|
|
p := newShareProbe()
|
|
tt := ui.NewTester(p.view, 640, 520)
|
|
// Two "Can view" selects show: the invite's, then Blaise's.
|
|
inv, _ := tt.Find("Permission for the invite")
|
|
r, _ := tt.Find("Blaise Pascal")
|
|
tt.ClickAt(inv.X+inv.W/2, r.Y+r.H/2)
|
|
if err := tt.Click("Can comment"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if p.members[1].Permission != PermissionComment || len(p.changed) != 1 || p.changed[0] != "b" {
|
|
t.Fatalf("permission %d changed %v", p.members[1].Permission, p.changed)
|
|
}
|
|
}
|
|
|
|
func TestShareDialogDisabled(t *testing.T) {
|
|
p := newShareProbe()
|
|
p.disabled = true
|
|
tt := ui.NewTester(p.view, 640, 520)
|
|
_ = tt.Click("Remove Blaise Pascal")
|
|
_ = tt.Click("Copy link")
|
|
if len(p.members) != 2 || p.copied != 0 {
|
|
t.Fatal("disabled dialog acted")
|
|
}
|
|
}
|
|
|
|
func TestShareDialogSnapshot(t *testing.T) {
|
|
snapshot(t, "share_dialog", 560, 440, func(c *ui.Context) {
|
|
p := ui.Local(c.Root(), "snap", newShareProbe)
|
|
ShareDialog(c, &(*p).open, &(*p).members, ShareDialogOptions{Title: "Ledger", Link: "https://court.org/ledger"})
|
|
})
|
|
}
|
|
|
|
func TestShareDialogAncestorDisabledCloses(t *testing.T) {
|
|
open, disabled := true, false
|
|
members := []ShareMember{{ID: "a", Name: "Ada"}}
|
|
tt := ui.NewTester(func(c *ui.Context) {
|
|
Use(c, Settings{})
|
|
ui.Column(c).Disabled(disabled).Children(func() {
|
|
ShareDialog(c, &open, &members, ShareDialogOptions{Title: "Decree"})
|
|
})
|
|
}, 600, 400)
|
|
disabled = true
|
|
tt.Frame()
|
|
if open || tt.HasText("Share “Decree”") {
|
|
t.Fatal("disabled dialog stayed open")
|
|
}
|
|
}
|
|
|
|
func TestShareDialogCopyCallback(t *testing.T) {
|
|
open := true
|
|
members := []ShareMember{}
|
|
var copied []string
|
|
tt := ui.NewTester(func(c *ui.Context) {
|
|
Use(c, Settings{})
|
|
ShareDialog(c, &open, &members, ShareDialogOptions{Title: "Ledger", Link: "https://court.org/ledger", OnCopy: func(s string) { copied = append(copied, s) }})
|
|
}, 600, 400)
|
|
if err := tt.Click("Copy link"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(copied) != 1 || copied[0] != "https://court.org/ledger" || tt.Clipboard() != "" {
|
|
t.Fatalf("callback count %d, clipboard %q", len(copied), tt.Clipboard())
|
|
}
|
|
}
|
|
func TestShareDialogLargeList(t *testing.T) {
|
|
open := true
|
|
members := make([]ShareMember, 100000)
|
|
for i := range members {
|
|
members[i] = ShareMember{ID: fmt.Sprint(i), Name: fmt.Sprintf("Member %d", i)}
|
|
}
|
|
tt := ui.NewTester(func(c *ui.Context) {
|
|
Use(c, Settings{})
|
|
ShareDialog(c, &open, &members, ShareDialogOptions{Title: "Roster"})
|
|
}, 640, 520)
|
|
n := 0
|
|
for _, text := range tt.Texts() {
|
|
if strings.HasPrefix(text, "Member ") {
|
|
n++
|
|
}
|
|
}
|
|
if n == 0 || n > 60 {
|
|
t.Fatalf("built %d member labels", n)
|
|
}
|
|
}
|
|
|
|
func TestShareDialogSameTitleIndependent(t *testing.T) {
|
|
openA, openB := true, false
|
|
membersA, membersB := []ShareMember{}, []ShareMember{}
|
|
var invited *ShareInvite
|
|
tt := ui.NewTester(func(c *ui.Context) {
|
|
Use(c, Settings{})
|
|
ui.Column(c).Children(func() {
|
|
ShareDialog(c, &openA, &membersA, ShareDialogOptions{Title: "Ledger"})
|
|
r := ShareDialog(c, &openB, &membersB, ShareDialogOptions{Title: "Ledger"})
|
|
if r.Invited != nil {
|
|
invited = r.Invited
|
|
}
|
|
})
|
|
}, 640, 520)
|
|
for i := 0; i < 10 && !tt.Focused("Email to invite"); i++ {
|
|
tt.Key(0, ui.KeyTab)
|
|
}
|
|
tt.Type("ada@court.org")
|
|
openA, openB = false, true
|
|
tt.Frame()
|
|
if err := tt.Click("Invite"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if invited != nil {
|
|
t.Fatal("second instance inherited invitation draft")
|
|
}
|
|
}
|