3
0

Additional model loading & describing tests

This commit is contained in:
Tomaž Jerman 2021-07-30 12:23:33 +02:00
parent 0b35f4ec0d
commit 4ed615585b
6 changed files with 263 additions and 1 deletions

View File

@ -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
}

View File

@ -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<Record>, join_key<String>, first_name<String>, last_name<String>, email<String>, number_of_numbers<Number>, createdAt<Date>, createdBy<User>, updatedAt<Date>, updatedBy<User>, deletedAt<Date>, deletedBy<User>",
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<Record>, name<String>, type<Select>, cost<Number>, time_spent<Number>, usr<String>, createdAt<Date>, createdBy<User>, updatedAt<Date>, updatedBy<User>, deletedAt<Date>, deletedBy<User>",
ff[0].Columns.String(),
)
})
t.Run("join", func(t *testing.T) {
ff := ff.FilterBySource("joined")
h.a.Len(ff, 2)
h.a.Equal(
"id<Record>, join_key<String>, first_name<String>, last_name<String>, email<String>, number_of_numbers<Number>, createdAt<Date>, createdBy<User>, updatedAt<Date>, updatedBy<User>, deletedAt<Date>, deletedBy<User>",
ff.FilterByRef("users")[0].Columns.String(),
)
h.a.Equal(
"id<Record>, name<String>, type<Select>, cost<Number>, time_spent<Number>, usr<String>, createdAt<Date>, createdBy<User>, updatedAt<Date>, updatedBy<User>, deletedAt<Date>, deletedBy<User>",
ff.FilterByRef("jobs")[0].Columns.String(),
)
})
}

View File

@ -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<String>, last_name<String>", 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<String>, count<Number>, total<Number>", f.Columns.String())
checkRows(h, f,
"Engel, 3, 179",
"Manu, 1, 61",
"Maria, 3, 183",
"Sascha, 1, 38",
"Sigi, 1, 67",
"Ulli, 3, 122")
}

View File

@ -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:])
}

View File

@ -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"]
}

View File

@ -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"
}]
}