Skip to content
Snippets Groups Projects
Commit d2067726 authored by Anton Sattarov's avatar Anton Sattarov :cucumber:
Browse files

fix tests

parent 7139be18
No related branches found
No related tags found
No related merge requests found
package filter
import (
"context"
"fmt"
"os"
"testing"
"time"
"git.perx.ru/perxis/perxis-go/pkg/schema"
"git.perx.ru/perxis/perxis-go/pkg/schema/field"
"git.perx.ru/perxis/perxis-go/pkg/schema/validate"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func TestFilterHandler(t *testing.T) {
......@@ -227,253 +221,253 @@ func TestFilterHandler(t *testing.T) {
})
}
func TestFilterHandler_Integration(t *testing.T) {
ctx := context.Background()
uri := os.Getenv("MONGO_URL")
if uri == "" {
uri = "mongodb://localhost:27017"
}
opts := options.Client().SetConnectTimeout(15 * time.Second).ApplyURI(uri)
client, err := mongo.Connect(context.Background(), opts)
require.NoError(t, err)
err = client.Ping(ctx, nil)
require.NoError(t, err)
sch := schema.New(
"name", field.String(validate.Required()),
"color", field.String(),
"qty", field.Number(field.NumberFormatInt),
"info", field.Object(
"is_fruit", field.Bool(),
"similar", field.Array(
field.Object(
"name", field.Number(field.NumberFormatFloat),
"color", field.String(),
),
),
"desc", field.String(),
),
"produced", field.Time(),
"shipment", field.Array(field.String()),
)
w1, _ := time.Parse(time.RFC3339, "2020-01-01T10:08:41Z")
w2, _ := time.Parse(time.RFC3339, "2020-05-01T10:08:41Z")
w3, _ := time.Parse(time.RFC3339, "2020-10-01T10:08:41Z")
items := []map[string]interface{}{
{
"name": "apple",
"color": "red",
"qty": 25,
"info": map[string]interface{}{
"is_fruit": true,
"similar": []interface{}{
map[string]interface{}{"name": "pear", "color": "yellow"},
map[string]interface{}{"name": "lemon", "color": "yellow"},
},
"desc": "An apple is the edible fruit . Apple trees are cultivated worldwide and have religious and mythological " +
"significance in many cultures. Apples are eaten with honey at the Jewish New Year of Rosh Hashanah to symbolize a sweet new year.",
},
"produced": w1,
"shipment": []interface{}{"Russia", "Iran"},
"storepoint": map[string]interface{}{"type": "Point", "coordinates": []float64{55.751472, 37.618727}},
},
{
"name": "orange",
"color": "orange",
"qty": 10,
"info": map[string]interface{}{
"is_fruit": true,
"similar": []interface{}{
map[string]interface{}{"name": "lemon", "color": "yellow"},
map[string]interface{}{"name": "grapefruit", "color": "red"},
},
"desc": "The orange is the edible fruit of various citrus species; a hybrid between pomelo and mandarin. Orange trees are widely grown" +
" in tropical and subtropical climates for their sweet fruit. The fruit of the orange tree can be eaten fresh, or processed for its juice or fragrant peel.",
},
"produced": w2,
"shipment": []interface{}{"Egypt", "Iran"},
"storepoint": map[string]interface{}{"type": "Point", "coordinates": []float64{55.716797, 37.552809}},
},
{
"name": "tomato",
"color": "red",
"qty": 1,
"info": map[string]interface{}{
"is_fruit": false,
"similar": []interface{}{
map[string]interface{}{"name": "cucumber", "color": "green"},
map[string]interface{}{"name": "apple", "color": "yellow"},
},
"desc": "The tomato is the edible red berry. The tomato is consumed in diverse ways, raw or cooked, in many dishes, " +
"sauces, salads, and drinks. Numerous varieties of the tomato plant are widely grown in temperate climates across the world.",
},
"produced": w3,
"shipment": []interface{}{"Russia", "Italy"},
"storepoint": map[string]interface{}{"type": "Point", "coordinates": []float64{55.760688, 37.619125}},
},
}
db := client.Database("perxis_test_filter")
coll := db.Collection("items")
coll.Drop(ctx)
for _, item := range items {
_, err = coll.InsertOne(ctx, item)
require.NoError(t, err)
}
h := NewFilterHandler(sch)
h.SetQueryBuilder(NewMongoQueryBuilder())
t.Run("By Color [Equal/NotEqual]", func(t *testing.T) {
t.Run("Red", func(t *testing.T) {
query := h.Query(&Filter{Op: Equal, Field: "color", Value: "red"})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 2)
assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
})
t.Run("Not Red", func(t *testing.T) {
query := h.Query(&Filter{Op: NotEqual, Field: "color", Value: "red"})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 1)
assert.Equal(t, "orange", data[0]["name"])
})
})
t.Run("By Quantity [Less/Greater]", func(t *testing.T) {
query := h.Query(&Filter{Op: LessOrEqual, Field: "qty", Value: 25}, &Filter{Op: Greater, Field: "qty", Value: 1})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 2)
assert.ElementsMatch(t, []interface{}{"apple", "orange"}, []interface{}{data[0]["name"], data[1]["name"]})
})
t.Run("Not Fruit [Equal embedded field]", func(t *testing.T) {
query := h.Query(&Filter{Op: Equal, Field: "info.is_fruit", Value: false})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 1)
assert.Equal(t, "tomato", data[0]["name"])
})
t.Run("By Similar [In/NotIn]", func(t *testing.T) {
t.Run("Similar to cucumber, pear", func(t *testing.T) {
query := h.Query(&Filter{Op: In, Field: "info.similar.name", Value: []string{"cucumber", "pear"}})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 2)
assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
})
t.Run("Not Similar to cucumber, pear", func(t *testing.T) {
query := h.Query(&Filter{Op: NotIn, Field: "info.similar.name", Value: []string{"cucumber", "grapefruit"}})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 1)
assert.Equal(t, "apple", data[0]["name"])
})
})
t.Run("By Description [Contains/NotContains]", func(t *testing.T) {
t.Run("Contains", func(t *testing.T) {
query := h.Query(&Filter{Op: And, Value: []*Filter{
&Filter{Op: In, Field: "info.similar.color", Value: []string{"yellow"}},
&Filter{Op: Contains, Field: "info.desc", Value: "edible fruit"},
}})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 2)
assert.ElementsMatch(t, []interface{}{"apple", "orange"}, []interface{}{data[0]["name"], data[1]["name"]})
})
t.Run("Not Contains", func(t *testing.T) {
query := h.Query(&Filter{Op: NotContains, Field: "info.desc", Value: "fruit"})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
for _, d := range data {
fmt.Println(d["name"])
}
require.Len(t, data, 1)
assert.Equal(t, "tomato", data[0]["name"])
})
})
t.Run("By Shipment [Contains/NotContains]", func(t *testing.T) {
t.Run("Contains", func(t *testing.T) {
query := h.Query(
&Filter{Op: Contains, Field: "shipment", Value: "Russia"},
)
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 2)
assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
})
t.Run("Not Contains", func(t *testing.T) {
query := h.Query(&Filter{Op: NotContains, Field: "shipment", Value: "Iran"})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
for _, d := range data {
fmt.Println(d["name"])
}
require.Len(t, data, 1)
assert.Equal(t, "tomato", data[0]["name"])
})
})
t.Run("Compound Query", func(t *testing.T) {
query := h.Query(&Filter{Op: Or, Value: []*Filter{
&Filter{Op: And, Value: []*Filter{
&Filter{Op: In, Field: "color", Value: []interface{}{"red", "yellow", "green"}},
&Filter{Op: Less, Field: "qty", Value: 10},
}}, // 1 - tomato
&Filter{Op: Equal, Field: "name", Value: "pepper"}, // 0
&Filter{Op: And, Value: []*Filter{
&Filter{Op: GreaterOrEqual, Field: "produced", Value: w1},
&Filter{Op: Less, Field: "produced", Value: w2}, // 1 - apple
}},
}})
res, err := coll.Find(ctx, query)
require.NoError(t, err)
var data []map[string]interface{}
err = res.All(ctx, &data)
require.NoError(t, err)
require.Len(t, data, 2)
assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
})
}
//func TestFilterHandler_Integration(t *testing.T) {
// ctx := context.Background()
//
// uri := os.Getenv("MONGO_URL")
// if uri == "" {
// uri = "mongodb://localhost:27017"
// }
// opts := options.Client().SetConnectTimeout(15 * time.Second).ApplyURI(uri)
// client, err := mongo.Connect(context.Background(), opts)
// require.NoError(t, err)
// err = client.Ping(ctx, nil)
// require.NoError(t, err)
//
// sch := schema.New(
// "name", field.String(validate.Required()),
// "color", field.String(),
// "qty", field.Number(field.NumberFormatInt),
// "info", field.Object(
// "is_fruit", field.Bool(),
// "similar", field.Array(
// field.Object(
// "name", field.Number(field.NumberFormatFloat),
// "color", field.String(),
// ),
// ),
// "desc", field.String(),
// ),
// "produced", field.Time(),
// "shipment", field.Array(field.String()),
// )
//
// w1, _ := time.Parse(time.RFC3339, "2020-01-01T10:08:41Z")
// w2, _ := time.Parse(time.RFC3339, "2020-05-01T10:08:41Z")
// w3, _ := time.Parse(time.RFC3339, "2020-10-01T10:08:41Z")
//
// items := []map[string]interface{}{
// {
// "name": "apple",
// "color": "red",
// "qty": 25,
// "info": map[string]interface{}{
// "is_fruit": true,
// "similar": []interface{}{
// map[string]interface{}{"name": "pear", "color": "yellow"},
// map[string]interface{}{"name": "lemon", "color": "yellow"},
// },
// "desc": "An apple is the edible fruit . Apple trees are cultivated worldwide and have religious and mythological " +
// "significance in many cultures. Apples are eaten with honey at the Jewish New Year of Rosh Hashanah to symbolize a sweet new year.",
// },
// "produced": w1,
// "shipment": []interface{}{"Russia", "Iran"},
// "storepoint": map[string]interface{}{"type": "Point", "coordinates": []float64{55.751472, 37.618727}},
// },
// {
// "name": "orange",
// "color": "orange",
// "qty": 10,
// "info": map[string]interface{}{
// "is_fruit": true,
// "similar": []interface{}{
// map[string]interface{}{"name": "lemon", "color": "yellow"},
// map[string]interface{}{"name": "grapefruit", "color": "red"},
// },
// "desc": "The orange is the edible fruit of various citrus species; a hybrid between pomelo and mandarin. Orange trees are widely grown" +
// " in tropical and subtropical climates for their sweet fruit. The fruit of the orange tree can be eaten fresh, or processed for its juice or fragrant peel.",
// },
// "produced": w2,
// "shipment": []interface{}{"Egypt", "Iran"},
// "storepoint": map[string]interface{}{"type": "Point", "coordinates": []float64{55.716797, 37.552809}},
// },
// {
// "name": "tomato",
// "color": "red",
// "qty": 1,
// "info": map[string]interface{}{
// "is_fruit": false,
// "similar": []interface{}{
// map[string]interface{}{"name": "cucumber", "color": "green"},
// map[string]interface{}{"name": "apple", "color": "yellow"},
// },
// "desc": "The tomato is the edible red berry. The tomato is consumed in diverse ways, raw or cooked, in many dishes, " +
// "sauces, salads, and drinks. Numerous varieties of the tomato plant are widely grown in temperate climates across the world.",
// },
// "produced": w3,
// "shipment": []interface{}{"Russia", "Italy"},
// "storepoint": map[string]interface{}{"type": "Point", "coordinates": []float64{55.760688, 37.619125}},
// },
// }
//
// db := client.Database("perxis_test_filter")
// coll := db.Collection("items")
// coll.Drop(ctx)
//
// for _, item := range items {
// _, err = coll.InsertOne(ctx, item)
// require.NoError(t, err)
// }
//
// h := NewFilterHandler(sch)
// h.SetQueryBuilder(NewMongoQueryBuilder())
//
// t.Run("By Color [Equal/NotEqual]", func(t *testing.T) {
// t.Run("Red", func(t *testing.T) {
// query := h.Query(&Filter{Op: Equal, Field: "color", Value: "red"})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 2)
// assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
// })
// t.Run("Not Red", func(t *testing.T) {
// query := h.Query(&Filter{Op: NotEqual, Field: "color", Value: "red"})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 1)
// assert.Equal(t, "orange", data[0]["name"])
// })
// })
// t.Run("By Quantity [Less/Greater]", func(t *testing.T) {
// query := h.Query(&Filter{Op: LessOrEqual, Field: "qty", Value: 25}, &Filter{Op: Greater, Field: "qty", Value: 1})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 2)
// assert.ElementsMatch(t, []interface{}{"apple", "orange"}, []interface{}{data[0]["name"], data[1]["name"]})
// })
// t.Run("Not Fruit [Equal embedded field]", func(t *testing.T) {
// query := h.Query(&Filter{Op: Equal, Field: "info.is_fruit", Value: false})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 1)
// assert.Equal(t, "tomato", data[0]["name"])
// })
// t.Run("By Similar [In/NotIn]", func(t *testing.T) {
// t.Run("Similar to cucumber, pear", func(t *testing.T) {
// query := h.Query(&Filter{Op: In, Field: "info.similar.name", Value: []string{"cucumber", "pear"}})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 2)
// assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
// })
// t.Run("Not Similar to cucumber, pear", func(t *testing.T) {
// query := h.Query(&Filter{Op: NotIn, Field: "info.similar.name", Value: []string{"cucumber", "grapefruit"}})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 1)
// assert.Equal(t, "apple", data[0]["name"])
// })
// })
// t.Run("By Description [Contains/NotContains]", func(t *testing.T) {
// t.Run("Contains", func(t *testing.T) {
// query := h.Query(&Filter{Op: And, Value: []*Filter{
// &Filter{Op: In, Field: "info.similar.color", Value: []string{"yellow"}},
// &Filter{Op: Contains, Field: "info.desc", Value: "edible fruit"},
// }})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 2)
// assert.ElementsMatch(t, []interface{}{"apple", "orange"}, []interface{}{data[0]["name"], data[1]["name"]})
// })
// t.Run("Not Contains", func(t *testing.T) {
// query := h.Query(&Filter{Op: NotContains, Field: "info.desc", Value: "fruit"})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// for _, d := range data {
// fmt.Println(d["name"])
// }
// require.Len(t, data, 1)
// assert.Equal(t, "tomato", data[0]["name"])
// })
// })
// t.Run("By Shipment [Contains/NotContains]", func(t *testing.T) {
// t.Run("Contains", func(t *testing.T) {
// query := h.Query(
// &Filter{Op: Contains, Field: "shipment", Value: "Russia"},
// )
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 2)
// assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
// })
// t.Run("Not Contains", func(t *testing.T) {
// query := h.Query(&Filter{Op: NotContains, Field: "shipment", Value: "Iran"})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// for _, d := range data {
// fmt.Println(d["name"])
// }
// require.Len(t, data, 1)
// assert.Equal(t, "tomato", data[0]["name"])
// })
// })
// t.Run("Compound Query", func(t *testing.T) {
// query := h.Query(&Filter{Op: Or, Value: []*Filter{
// &Filter{Op: And, Value: []*Filter{
// &Filter{Op: In, Field: "color", Value: []interface{}{"red", "yellow", "green"}},
// &Filter{Op: Less, Field: "qty", Value: 10},
// }}, // 1 - tomato
// &Filter{Op: Equal, Field: "name", Value: "pepper"}, // 0
// &Filter{Op: And, Value: []*Filter{
// &Filter{Op: GreaterOrEqual, Field: "produced", Value: w1},
// &Filter{Op: Less, Field: "produced", Value: w2}, // 1 - apple
// }},
// }})
// res, err := coll.Find(ctx, query)
// require.NoError(t, err)
//
// var data []map[string]interface{}
// err = res.All(ctx, &data)
// require.NoError(t, err)
// require.Len(t, data, 2)
// assert.ElementsMatch(t, []interface{}{"apple", "tomato"}, []interface{}{data[0]["name"], data[1]["name"]})
// })
//}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment