Additional model loading & describing tests
This commit is contained in:
parent
0b35f4ec0d
commit
4ed615585b
@ -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
|
||||
}
|
||||
|
||||
48
tests/reporter/0001_describe_basic_test.go
Normal file
48
tests/reporter/0001_describe_basic_test.go
Normal 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(),
|
||||
)
|
||||
})
|
||||
}
|
||||
46
tests/reporter/0007_modeling_multi_test.go
Normal file
46
tests/reporter/0007_modeling_multi_test.go
Normal 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")
|
||||
}
|
||||
@ -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:])
|
||||
}
|
||||
|
||||
38
tests/reporter/testdata/S0001_describe_basic/report.json
vendored
Normal file
38
tests/reporter/testdata/S0001_describe_basic/report.json
vendored
Normal 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"]
|
||||
}
|
||||
51
tests/reporter/testdata/S7001_modeling_multi/report.json
vendored
Normal file
51
tests/reporter/testdata/S7001_modeling_multi/report.json
vendored
Normal 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"
|
||||
}]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user