star/gdu/tui/export_test.go

204 lines
4.6 KiB
Go
Raw Normal View History

2025-04-26 19:33:14 +08:00
package tui
import (
"bytes"
"os"
"testing"
"b612.me/apps/b612/gdu/internal/testanalyze"
"b612.me/apps/b612/gdu/internal/testapp"
"b612.me/apps/b612/gdu/pkg/analyze"
"b612.me/apps/b612/gdu/pkg/fs"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
"github.com/stretchr/testify/assert"
)
func TestConfirmExport(t *testing.T) {
simScreen := testapp.CreateSimScreen()
defer simScreen.Fini()
app := testapp.CreateMockedApp(true)
ui := CreateUI(app, simScreen, &bytes.Buffer{}, false, true, false, false, false)
ui.done = make(chan struct{})
ui.Analyzer = &testanalyze.MockedAnalyzer{}
ui.keyPressed(tcell.NewEventKey(tcell.KeyRune, 'E', 0))
assert.True(t, ui.pages.HasPage("export"))
ui.keyPressed(tcell.NewEventKey(tcell.KeyRune, 'n', 0))
ui.keyPressed(tcell.NewEventKey(tcell.KeyEnter, 0, 0))
assert.True(t, ui.pages.HasPage("export"))
}
func TestExportAnalysis(t *testing.T) {
parentDir := &analyze.Dir{
File: &analyze.File{
Name: "parent",
},
Files: make([]fs.Item, 0, 1),
}
currentDir := &analyze.Dir{
File: &analyze.File{
Name: "sub",
Parent: parentDir,
},
}
simScreen := testapp.CreateSimScreen()
defer simScreen.Fini()
app := testapp.CreateMockedApp(true)
ui := CreateUI(app, simScreen, &bytes.Buffer{}, false, true, false, false, false)
ui.done = make(chan struct{})
ui.Analyzer = &testanalyze.MockedAnalyzer{}
ui.currentDir = currentDir
ui.topDir = parentDir
ui.exportAnalysis()
assert.True(t, ui.pages.HasPage("exporting"))
<-ui.done
assert.FileExists(t, "export.json")
err := os.Remove("export.json")
assert.NoError(t, err)
for _, f := range ui.app.(*testapp.MockedApp).GetUpdateDraws() {
f()
}
}
func TestExportAnalysisEsc(t *testing.T) {
parentDir := &analyze.Dir{
File: &analyze.File{
Name: "parent",
},
Files: make([]fs.Item, 0, 1),
}
currentDir := &analyze.Dir{
File: &analyze.File{
Name: "sub",
Parent: parentDir,
},
}
simScreen := testapp.CreateSimScreen()
defer simScreen.Fini()
app := testapp.CreateMockedApp(true)
ui := CreateUI(app, simScreen, &bytes.Buffer{}, false, true, false, false, false)
ui.done = make(chan struct{})
ui.Analyzer = &testanalyze.MockedAnalyzer{}
ui.currentDir = currentDir
ui.topDir = parentDir
form := ui.confirmExport()
formInputFn := form.GetInputCapture()
assert.True(t, ui.pages.HasPage("export"))
formInputFn(tcell.NewEventKey(tcell.KeyEsc, 0, 0))
assert.False(t, ui.pages.HasPage("export"))
}
func TestExportAnalysisWithName(t *testing.T) {
parentDir := &analyze.Dir{
File: &analyze.File{
Name: "parent",
},
Files: make([]fs.Item, 0, 1),
}
currentDir := &analyze.Dir{
File: &analyze.File{
Name: "sub",
Parent: parentDir,
},
}
simScreen := testapp.CreateSimScreen()
defer simScreen.Fini()
app := testapp.CreateMockedApp(true)
ui := CreateUI(app, simScreen, &bytes.Buffer{}, false, true, false, false, false)
ui.done = make(chan struct{})
ui.Analyzer = &testanalyze.MockedAnalyzer{}
ui.currentDir = currentDir
ui.topDir = parentDir
form := ui.confirmExport()
// formInputFn := form.GetInputCapture()
item := form.GetFormItemByLabel("File name")
inputFn := item.(*tview.InputField).InputHandler()
// send 'n' to input
inputFn(tcell.NewEventKey(tcell.KeyRune, 'n', 0), nil)
assert.Equal(t, "export.jsonn", ui.exportName)
assert.True(t, ui.pages.HasPage("export"))
form.GetButton(0).InputHandler()(tcell.NewEventKey(tcell.KeyEnter, 0, 0), nil)
assert.True(t, ui.pages.HasPage("exporting"))
<-ui.done
assert.FileExists(t, "export.jsonn")
err := os.Remove("export.jsonn")
assert.NoError(t, err)
for _, f := range ui.app.(*testapp.MockedApp).GetUpdateDraws() {
f()
}
}
func TestExportAnalysisWithoutRights(t *testing.T) {
parentDir := &analyze.Dir{
File: &analyze.File{
Name: "parent",
},
Files: make([]fs.Item, 0, 1),
}
currentDir := &analyze.Dir{
File: &analyze.File{
Name: "sub",
Parent: parentDir,
},
}
_, err := os.Create("export.json")
assert.NoError(t, err)
err = os.Chmod("export.json", 0)
assert.NoError(t, err)
defer func() {
err = os.Chmod("export.json", 0o755)
assert.Nil(t, err)
err = os.Remove("export.json")
assert.NoError(t, err)
}()
simScreen := testapp.CreateSimScreen()
defer simScreen.Fini()
app := testapp.CreateMockedApp(true)
ui := CreateUI(app, simScreen, &bytes.Buffer{}, false, true, false, false, false)
ui.done = make(chan struct{})
ui.Analyzer = &testanalyze.MockedAnalyzer{}
ui.currentDir = currentDir
ui.topDir = parentDir
ui.exportAnalysis()
<-ui.done
for _, f := range ui.app.(*testapp.MockedApp).GetUpdateDraws() {
f()
}
assert.True(t, ui.pages.HasPage("error"))
}