package cmdpacks_test import ( "fmt" "github.com/lmika/dynamo-browse/internal/common/ui/commandctrl/cmdpacks" "github.com/lmika/dynamo-browse/internal/dynamo-browse/models" "github.com/stretchr/testify/assert" "testing" ) func TestModRS_New(t *testing.T) { svc := newService(t) rsProxy, err := svc.CommandController.ExecuteAndWait(t.Context(), `rs:new`) assert.NoError(t, err) assert.IsType(t, rsProxy, cmdpacks.SimpleProxy[*models.ResultSet]{}) } func TestModRS_NextPage(t *testing.T) { t.Run("multiple pages", func(t *testing.T) { svc := newService(t, withDataGenerator(largeTestData), withTable("large-table"), withDefaultLimit(20)) hasNextPage, err := svc.CommandController.ExecuteAndWait(t.Context(), `@resultset.HasNextPage`) assert.NoError(t, err) assert.True(t, hasNextPage.(bool)) // Page 2 rsProxy, err := svc.CommandController.ExecuteAndWait(t.Context(), `rs:next-page @resultset`) assert.NoError(t, err) assert.IsType(t, cmdpacks.SimpleProxy[*models.ResultSet]{}, rsProxy) assert.Equal(t, 20, len(rsProxy.(cmdpacks.SimpleProxy[*models.ResultSet]).ProxyValue().Items())) hasNextPage, err = svc.CommandController.ExecuteAndWait(t.Context(), `(rs:next-page @resultset).HasNextPage`) assert.NoError(t, err) assert.True(t, hasNextPage.(bool)) // Page 3 rsProxy, err = svc.CommandController.ExecuteAndWait(t.Context(), `rs:next-page @resultset | rs:next-page`) assert.NoError(t, err) assert.IsType(t, cmdpacks.SimpleProxy[*models.ResultSet]{}, rsProxy) assert.Equal(t, 10, len(rsProxy.(cmdpacks.SimpleProxy[*models.ResultSet]).ProxyValue().Items())) hasNextPage, err = svc.CommandController.ExecuteAndWait(t.Context(), `(rs:next-page @resultset | rs:next-page).HasNextPage`) assert.NoError(t, err) assert.False(t, hasNextPage.(bool)) // Last page rsProxy, err = svc.CommandController.ExecuteAndWait(t.Context(), `rs:next-page (rs:next-page @resultset | rs:next-page)`) assert.NoError(t, err) assert.Nil(t, rsProxy) }) t.Run("only one page", func(t *testing.T) { svc := newService(t) hasNextPage, err := svc.CommandController.ExecuteAndWait(t.Context(), `@resultset.HasNextPage`) assert.NoError(t, err) assert.False(t, hasNextPage.(bool)) rsProxy, err := svc.CommandController.ExecuteAndWait(t.Context(), `rs:next-page @resultset`) assert.NoError(t, err) assert.Nil(t, rsProxy) }) } func TestModRS_Union(t *testing.T) { svc := newService(t, withDefaultLimit(2)) rsProxy, err := svc.CommandController.ExecuteAndWait(t.Context(), ` $mr = rs:union @resultset (rs:next-page @resultset) assert (eq (len $mr.Items) 3) "expected len == 3" assert (eq $mr.Items.(0).pk "abc") "expected 0.pk" assert (eq $mr.Items.(0).sk "111") "expected 0.sk" assert (eq $mr.Items.(1).pk "abc") "expected 1.pk" assert (eq $mr.Items.(1).sk "222") "expected 1.sk" assert (eq $mr.Items.(2).pk "bbb") "expected 2.pk" assert (eq $mr.Items.(2).sk "131") "expected 2.sk" $mr `) assert.NoError(t, err) assert.IsType(t, cmdpacks.SimpleProxy[*models.ResultSet]{}, rsProxy) rs := rsProxy.(cmdpacks.SimpleProxy[*models.ResultSet]).ProxyValue() assert.Equal(t, 3, len(rs.Items())) } func TestModRS_Query(t *testing.T) { tests := []struct { descr string cmd string wantRows []int }{ { descr: "query with pk 1", cmd: `rs:query 'pk="abc"' -table service-test-data`, wantRows: []int{0, 1}, }, { descr: "query with pk 2", cmd: `rs:query 'pk="bbb"' -table service-test-data`, wantRows: []int{2}, }, { descr: "query with sk 1", cmd: `rs:query 'sk="222"' -table service-test-data`, wantRows: []int{1}, }, { descr: "query with args 1", cmd: `rs:query 'pk=$v' [v:'abc'] -table service-test-data`, wantRows: []int{0, 1}, }, { descr: "query with args 2", cmd: `rs:query ':k=$v' [k:'pk' v:'abc'] -table service-test-data`, wantRows: []int{0, 1}, }, { descr: "query with args 3", cmd: `rs:query ':k=$v' [k:'beta' v:1231] -table service-test-data`, wantRows: []int{1}, }, { descr: "query with args with no table set", cmd: `rs:query ':k=$v' [k:'beta' v:1231]`, wantRows: []int{1}, }, } for _, tt := range tests { t.Run(tt.descr, func(t *testing.T) { svc := newService(t) res, err := svc.CommandController.ExecuteAndWait(t.Context(), tt.cmd) assert.NoError(t, err) rs := res.(cmdpacks.SimpleProxy[*models.ResultSet]).ProxyValue() assert.Len(t, rs.Items(), len(tt.wantRows)) for i, rowIndex := range tt.wantRows { for key, want := range svc.testData[0].Data[rowIndex] { have, ok := rs.Items()[i].AttributeValueAsString(key) assert.True(t, ok) assert.Equal(t, fmt.Sprint(want), have) } } }) } }