From 2df0fc7e27f4d008eeb6e84708ac82d1727fef01 Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Mon, 18 Jul 2022 20:58:07 +1000 Subject: [PATCH] Added a confirmation before querying or rescanning when dirty items This is to avoid clobbering any dirty items. --- .../dynamo-browse/controllers/tableread.go | 33 +++++++++++++++--- .../controllers/tableread_test.go | 34 +++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/internal/dynamo-browse/controllers/tableread.go b/internal/dynamo-browse/controllers/tableread.go index a6e426e..d4f013d 100644 --- a/internal/dynamo-browse/controllers/tableread.go +++ b/internal/dynamo-browse/controllers/tableread.go @@ -92,7 +92,7 @@ func (c *TableReadController) PromptForQuery() tea.Cmd { return events.SetError(err) } - return func() tea.Msg { + return c.doIfNoneDirty(func() tea.Msg { resultSet := c.state.ResultSet() newResultSet, err := c.tableService.ScanOrQuery(context.Background(), resultSet.TableInfo, expr) if err != nil { @@ -100,17 +100,42 @@ func (c *TableReadController) PromptForQuery() tea.Cmd { } return c.setResultSetAndFilter(newResultSet, "") - } + }) }, } } } -func (c *TableReadController) Rescan() tea.Cmd { +func (c *TableReadController) doIfNoneDirty(cmd tea.Cmd) tea.Cmd { + var anyDirty = false + for i := 0; i < len(c.state.ResultSet().Items()); i++ { + anyDirty = anyDirty || c.state.ResultSet().IsDirty(i) + } + + if !anyDirty { + return cmd + } + return func() tea.Msg { + return events.PromptForInputMsg{ + Prompt: "reset modified items? ", + OnDone: func(value string) tea.Cmd { + if value != "y" { + return events.SetStatus("operation aborted") + } + + return cmd + }, + } + } + +} + +func (c *TableReadController) Rescan() tea.Cmd { + return c.doIfNoneDirty(func() tea.Msg { resultSet := c.state.ResultSet() return c.doScan(context.Background(), resultSet, resultSet.Query) - } + }) } func (c *TableReadController) ExportCSV(filename string) tea.Cmd { diff --git a/internal/dynamo-browse/controllers/tableread_test.go b/internal/dynamo-browse/controllers/tableread_test.go index 1705a9a..752c65f 100644 --- a/internal/dynamo-browse/controllers/tableread_test.go +++ b/internal/dynamo-browse/controllers/tableread_test.go @@ -62,6 +62,40 @@ func TestTableReadController_ListTables(t *testing.T) { }) } +func TestTableReadController_Rescan(t *testing.T) { + client := testdynamo.SetupTestTable(t, testData) + + provider := dynamo.NewProvider(client) + service := tables.NewService(provider) + state := controllers.NewState() + readController := controllers.NewTableReadController(state, service, "bravo-table") + + t.Run("should perform a rescan", func(t *testing.T) { + invokeCommand(t, readController.Init()) + invokeCommand(t, readController.Rescan()) + }) + + t.Run("should prompt to rescan if any dirty rows", func(t *testing.T) { + invokeCommand(t, readController.Init()) + + state.ResultSet().SetDirty(0, true) + + invokeCommandWithPrompt(t, readController.Rescan(), "y") + + assert.False(t, state.ResultSet().IsDirty(0)) + }) + + t.Run("should not rescan if any dirty rows", func(t *testing.T) { + invokeCommand(t, readController.Init()) + + state.ResultSet().SetDirty(0, true) + + invokeCommandWithPrompt(t, readController.Rescan(), "n") + + assert.True(t, state.ResultSet().IsDirty(0)) + }) +} + func TestTableReadController_ExportCSV(t *testing.T) { client := testdynamo.SetupTestTable(t, testData)