From 4ed615585be798ee3204e2ed4e15af4982626770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Fri, 30 Jul 2021 12:23:33 +0200 Subject: [PATCH] Additional model loading & describing tests --- pkg/report/frame.go | 24 ++++++++ tests/reporter/0001_describe_basic_test.go | 48 ++++++++++++++++ tests/reporter/0007_modeling_multi_test.go | 46 +++++++++++++++ tests/reporter/main_test.go | 57 ++++++++++++++++++- .../testdata/S0001_describe_basic/report.json | 38 +++++++++++++ .../testdata/S7001_modeling_multi/report.json | 51 +++++++++++++++++ 6 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 tests/reporter/0001_describe_basic_test.go create mode 100644 tests/reporter/0007_modeling_multi_test.go create mode 100644 tests/reporter/testdata/S0001_describe_basic/report.json create mode 100644 tests/reporter/testdata/S7001_modeling_multi/report.json diff --git a/pkg/report/frame.go b/pkg/report/frame.go index 30532f8c3..d2d06ef5d 100644 --- a/pkg/report/frame.go +++ b/pkg/report/frame.go @@ -407,3 +407,27 @@ func (r FrameRow) String() string { return strings.Trim(out, ", ") } + +func (dd FrameDescriptionSet) FilterBySource(source string) FrameDescriptionSet { + out := make(FrameDescriptionSet, 0, len(dd)) + + for _, d := range dd { + if d.Source == source { + out = append(out, d) + } + } + + return out +} + +func (dd FrameDescriptionSet) FilterByRef(ref string) FrameDescriptionSet { + out := make(FrameDescriptionSet, 0, len(dd)) + + for _, d := range dd { + if d.Ref == ref { + out = append(out, d) + } + } + + return out +} diff --git a/tests/reporter/0001_describe_basic_test.go b/tests/reporter/0001_describe_basic_test.go new file mode 100644 index 000000000..c0232efb5 --- /dev/null +++ b/tests/reporter/0001_describe_basic_test.go @@ -0,0 +1,48 @@ +package reporter + +import ( + "testing" +) + +func Test0001_describe_basic(t *testing.T) { + var ( + ctx, h, s = setup(t) + m, r, _ = loadScenario(ctx, s, t, h) + ff = describeNoErr(ctx, h, m, r.Describe...) + ) + + t.Run("load/users", func(t *testing.T) { + ff := ff.FilterBySource("users") + h.a.Len(ff, 1) + + h.a.Equal( + "id, join_key, first_name, last_name, email, number_of_numbers, createdAt, createdBy, updatedAt, updatedBy, deletedAt, deletedBy", + ff[0].Columns.String(), + ) + }) + + t.Run("load/jobs", func(t *testing.T) { + ff := ff.FilterBySource("jobs") + h.a.Len(ff, 1) + + h.a.Equal( + "id, name, type, cost, time_spent, usr, createdAt, createdBy, updatedAt, updatedBy, deletedAt, deletedBy", + ff.FilterByRef("jobs")[0].Columns.String(), + ) + }) +} diff --git a/tests/reporter/0007_modeling_multi_test.go b/tests/reporter/0007_modeling_multi_test.go new file mode 100644 index 000000000..01061c29a --- /dev/null +++ b/tests/reporter/0007_modeling_multi_test.go @@ -0,0 +1,46 @@ +package reporter + +import ( + "testing" + + "github.com/cortezaproject/corteza-server/pkg/report" +) + +func Test7001_modeling_multi(t *testing.T) { + var ( + ctx, h, s = setup(t) + m, _, dd = loadScenario(ctx, s, t, h) + ff = loadNoErrMulti(ctx, h, m, dd...) + f *report.Frame + ) + + h.a.Len(ff, 2) + + f = ff[0] + h.a.Equal("users", f.Source) + h.a.Equal("first_name, last_name", f.Columns.String()) + checkRows(h, f, + "Engel, Loritz", + "Engel, Kempf", + "Engel, Kiefer", + "Manu, Specht", + "Maria, Königsmann", + "Maria, Spannagel", + "Maria, Krüger", + "Sascha, Jans", + "Sigi, Goldschmidt", + "Ulli, Haupt", + "Ulli, Böhler", + "Ulli, Förstner") + + f = ff[1] + h.a.Equal("grouped", f.Source) + h.a.Equal("by_name, count, total", f.Columns.String()) + checkRows(h, f, + "Engel, 3, 179", + "Manu, 1, 61", + "Maria, 3, 183", + "Sascha, 1, 38", + "Sigi, 1, 67", + "Ulli, 3, 122") +} diff --git a/tests/reporter/main_test.go b/tests/reporter/main_test.go index 1b99b6079..3d596d5e9 100644 --- a/tests/reporter/main_test.go +++ b/tests/reporter/main_test.go @@ -51,7 +51,8 @@ type ( auxReport struct { *types.Report - Frames report.FrameDefinitionSet `json:"frames"` + Frames report.FrameDefinitionSet `json:"frames"` + Describe []string `json:"describe"` } valueDef map[string][]string @@ -181,6 +182,60 @@ func loadNoErr(ctx context.Context, h helper, m report.M, dd ...*report.FrameDef return } +// loadNoErrMulti is a little wrapper that does some preprocessing on the frame definitions. +// It is a copy from the system/service/report. +// +// @todo make this cleaner! +func loadNoErrMulti(ctx context.Context, h helper, m report.M, dd ...*report.FrameDefinition) (ff []*report.Frame) { + ff = make([]*report.Frame, 0, len(dd)) + + auxdd := make([]*report.FrameDefinition, 0, len(dd)) + for i, d := range dd { + // first one; nothing special needed + if i == 0 { + auxdd = append(auxdd, d) + continue + } + + // if the current source matches the prev. source, and they both define references, + // they fall into the same chunk. + if (d.Source == dd[i-1].Source) && (d.Ref != "" && dd[i-1].Ref != "") { + auxdd = append(auxdd, d) + continue + } + + // if the current one doesn't fall into the current chunk, process + // the chunk and reset it + aux, err := m.Load(ctx, auxdd...) + h.a.NoError(err) + ff = append(ff, aux...) + + auxdd = make([]*report.FrameDefinition, 0, len(dd)) + auxdd = append(auxdd, d) + } + + if len(auxdd) > 0 { + aux, err := m.Load(ctx, auxdd...) + h.a.NoError(err) + ff = append(ff, aux...) + } + + return +} + +func describeNoErr(ctx context.Context, h helper, m report.M, dd ...string) (ff report.FrameDescriptionSet) { + ff = make(report.FrameDescriptionSet, 0, len(dd)) + + for _, d := range dd { + aux, err := m.Describe(ctx, d) + h.a.NoError(err) + + ff = append(ff, aux...) + } + + return +} + func loadScenario(ctx context.Context, s store.Storer, t *testing.T, h helper) (report.M, *auxReport, report.FrameDefinitionSet) { return loadScenarioWithName(ctx, s, t, h, "S"+t.Name()[4:]) } diff --git a/tests/reporter/testdata/S0001_describe_basic/report.json b/tests/reporter/testdata/S0001_describe_basic/report.json new file mode 100644 index 000000000..7f60f358a --- /dev/null +++ b/tests/reporter/testdata/S0001_describe_basic/report.json @@ -0,0 +1,38 @@ +{ + "handle": "testing_report", + "sources": [{ + "name": "unnamed_src", + "groups": [ + { + "name": "unnamed_grp", + "steps": [ + { "load": { + "name": "users", + "source": "composeRecords", + "definition": { + "module": "user", + "namespace": "ns" + } + }}, + { "load": { + "name": "jobs", + "source": "composeRecords", + "definition": { + "module": "job", + "namespace": "ns" + } + }}, + + { "join": { + "name": "joined", + "localSource": "users", + "localColumn": "join_key", + "foreignSource": "jobs", + "foreignColumn": "usr" + }} + ] + } + ] + }], + "describe": ["users", "jobs", "joined"] +} diff --git a/tests/reporter/testdata/S7001_modeling_multi/report.json b/tests/reporter/testdata/S7001_modeling_multi/report.json new file mode 100644 index 000000000..4dfa397c9 --- /dev/null +++ b/tests/reporter/testdata/S7001_modeling_multi/report.json @@ -0,0 +1,51 @@ +{ + "handle": "testing_report", + "sources": [{ + "name": "unnamed_src", + "groups": [ + { + "name": "unnamed_grp", + "steps": [ + { "load": { + "name": "users", + "source": "composeRecords", + "definition": { + "module": "user", + "namespace": "ns" + } + }}, + + { "group": { + "name": "grouped", + "source": "users", + "keys": [ + { "name": "by_name", "column": "first_name" } + ], + "columns": [ + { "name": "count", "aggregate": "count" }, + { "name": "total", "aggregate": "sum", "column": "number_of_numbers" } + ] + }} + ] + } + ] + }], + "frames": [{ + "name": "base", + "source": "users", + "columns": [ + { "name": "first_name", "label": "first_name" }, + { "name": "last_name", "label": "last_name" } + ], + "sort": "first_name ASC" + }, { + "name": "result", + "source": "grouped", + "columns": [ + { "name": "by_name", "label": "by_name" }, + { "name": "count", "label": "count" }, + { "name": "total", "label": "total" } + ], + "sort": "by_name ASC" + }] +}