2021-01-17 03:29:50 +00:00
|
|
|
package mongo_test
|
|
|
|
|
|
|
|
import (
|
2021-01-23 13:03:16 +00:00
|
|
|
"bytes"
|
2021-01-17 03:29:50 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/sunboyy/repogen/internal/code"
|
|
|
|
"github.com/sunboyy/repogen/internal/mongo"
|
2021-01-23 13:03:16 +00:00
|
|
|
"github.com/sunboyy/repogen/internal/spec"
|
|
|
|
"github.com/sunboyy/repogen/internal/testutils"
|
2021-01-17 03:29:50 +00:00
|
|
|
)
|
|
|
|
|
2021-01-23 13:03:16 +00:00
|
|
|
const expectedConstructorResult = `
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewUserRepository(collection *mongo.Collection) UserRepository {
|
|
|
|
return &UserRepositoryMongo{
|
|
|
|
collection: collection,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type UserRepositoryMongo struct {
|
|
|
|
collection *mongo.Collection
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
func TestGenerateConstructor(t *testing.T) {
|
2021-01-17 03:29:50 +00:00
|
|
|
userModel := code.Struct{
|
|
|
|
Name: "UserModel",
|
|
|
|
Fields: code.StructFields{
|
|
|
|
{
|
|
|
|
Name: "ID",
|
|
|
|
Type: code.ExternalType{PackageAlias: "primitive", Name: "ObjectID"},
|
|
|
|
Tags: map[string][]string{"bson": {"_id", "omitempty"}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Username",
|
|
|
|
Type: code.SimpleType("string"),
|
|
|
|
Tags: map[string][]string{"bson": {"username"}},
|
|
|
|
},
|
2021-01-19 12:26:26 +00:00
|
|
|
{
|
|
|
|
Name: "Gender",
|
|
|
|
Type: code.SimpleType("Gender"),
|
|
|
|
Tags: map[string][]string{"bson": {"gender"}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Age",
|
|
|
|
Type: code.SimpleType("int"),
|
|
|
|
Tags: map[string][]string{"bson": {"age"}},
|
|
|
|
},
|
2021-01-17 03:29:50 +00:00
|
|
|
},
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
generator := mongo.NewGenerator(userModel, "UserRepository")
|
|
|
|
buffer := new(bytes.Buffer)
|
|
|
|
|
|
|
|
err := generator.GenerateConstructor(buffer)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
if err := testutils.ExpectMultiLineString(expectedConstructorResult, buffer.String()); err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type GenerateMethodTestCase struct {
|
|
|
|
Name string
|
|
|
|
MethodSpec spec.MethodSpec
|
|
|
|
ExpectedCode string
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGenerateMethod(t *testing.T) {
|
|
|
|
testTable := []GenerateMethodTestCase{
|
|
|
|
{
|
|
|
|
Name: "simple find one method",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
2021-01-17 03:29:50 +00:00
|
|
|
Name: "FindByID",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "id", Type: code.ExternalType{PackageAlias: "primitive", Name: "ObjectID"}},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{code.PointerType{ContainedType: code.SimpleType("UserModel")}, code.SimpleType("error")},
|
2021-01-23 13:03:16 +00:00
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeOne,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorEqual, Field: "ID"},
|
|
|
|
},
|
|
|
|
},
|
2021-01-17 03:29:50 +00:00
|
|
|
},
|
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
ExpectedCode: `
|
|
|
|
func (r *UserRepositoryMongo) FindByID(ctx context.Context, arg0 primitive.ObjectID) (*UserModel, error) {
|
|
|
|
var entity UserModel
|
|
|
|
if err := r.collection.FindOne(ctx, bson.M{
|
|
|
|
"_id": arg0,
|
|
|
|
}).Decode(&entity); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &entity, nil
|
|
|
|
}
|
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "simple find many method",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByGender",
|
2021-01-19 12:26:26 +00:00
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
2021-01-21 11:56:30 +00:00
|
|
|
{Name: "gender", Type: code.SimpleType("Gender")},
|
2021-01-19 12:26:26 +00:00
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorEqual, Field: "Gender"},
|
|
|
|
},
|
|
|
|
},
|
2021-01-19 12:26:26 +00:00
|
|
|
},
|
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
ExpectedCode: `
|
|
|
|
func (r *UserRepositoryMongo) FindByGender(ctx context.Context, arg0 Gender) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"gender": arg0,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with And operator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByGenderAndAge",
|
2021-01-19 12:26:26 +00:00
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
2021-01-23 13:03:16 +00:00
|
|
|
{Name: "gender", Type: code.SimpleType("Gender")},
|
2021-01-19 12:26:26 +00:00
|
|
|
{Name: "age", Type: code.SimpleType("int")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Operator: spec.OperatorAnd,
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorEqual, Field: "Gender"},
|
|
|
|
{Comparator: spec.ComparatorEqual, Field: "Age"},
|
|
|
|
},
|
|
|
|
},
|
2021-01-19 12:26:26 +00:00
|
|
|
},
|
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
ExpectedCode: `
|
|
|
|
func (r *UserRepositoryMongo) FindByGenderAndAge(ctx context.Context, arg0 Gender, arg1 int) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"gender": arg0,
|
|
|
|
"age": arg1,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with Or operator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByGenderOrAge",
|
2021-01-19 12:35:54 +00:00
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "gender", Type: code.SimpleType("Gender")},
|
|
|
|
{Name: "age", Type: code.SimpleType("int")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Operator: spec.OperatorOr,
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorEqual, Field: "Gender"},
|
|
|
|
{Comparator: spec.ComparatorEqual, Field: "Age"},
|
|
|
|
},
|
|
|
|
},
|
2021-01-22 02:56:30 +00:00
|
|
|
},
|
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
ExpectedCode: `
|
|
|
|
func (r *UserRepositoryMongo) FindByGenderOrAge(ctx context.Context, arg0 Gender, arg1 int) ([]*UserModel, error) {
|
2021-01-17 03:29:50 +00:00
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
2021-01-23 13:03:16 +00:00
|
|
|
"$or": []bson.M{
|
|
|
|
{"gender": arg0},
|
|
|
|
{"age": arg1},
|
|
|
|
},
|
2021-01-17 03:29:50 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with Not comparator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByGenderNot",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "gender", Type: code.SimpleType("Gender")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorNot, Field: "Gender"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ExpectedCode: `
|
2021-01-21 11:56:30 +00:00
|
|
|
func (r *UserRepositoryMongo) FindByGenderNot(ctx context.Context, arg0 Gender) ([]*UserModel, error) {
|
2021-01-19 12:26:26 +00:00
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"gender": bson.M{"$ne": arg0},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with LessThan comparator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByAgeLessThan",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "age", Type: code.SimpleType("int")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorLessThan, Field: "Age"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ExpectedCode: `
|
2021-01-19 12:26:26 +00:00
|
|
|
func (r *UserRepositoryMongo) FindByAgeLessThan(ctx context.Context, arg0 int) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"age": bson.M{"$lt": arg0},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with LessThanEqual comparator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByAgeLessThanEqual",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "age", Type: code.SimpleType("int")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorLessThanEqual, Field: "Age"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ExpectedCode: `
|
2021-01-19 12:26:26 +00:00
|
|
|
func (r *UserRepositoryMongo) FindByAgeLessThanEqual(ctx context.Context, arg0 int) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"age": bson.M{"$lte": arg0},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with GreaterThan comparator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByAgeGreaterThan",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "age", Type: code.SimpleType("int")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorGreaterThan, Field: "Age"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ExpectedCode: `
|
2021-01-19 12:26:26 +00:00
|
|
|
func (r *UserRepositoryMongo) FindByAgeGreaterThan(ctx context.Context, arg0 int) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"age": bson.M{"$gt": arg0},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with GreaterThanEqual comparator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByAgeGreaterThanEqual",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "age", Type: code.SimpleType("int")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorGreaterThanEqual, Field: "Age"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ExpectedCode: `
|
2021-01-19 12:26:26 +00:00
|
|
|
func (r *UserRepositoryMongo) FindByAgeGreaterThanEqual(ctx context.Context, arg0 int) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"age": bson.M{"$gte": arg0},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-24 08:31:21 +00:00
|
|
|
`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "find with Between comparator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByAgeBetween",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "fromAge", Type: code.SimpleType("int")},
|
|
|
|
{Name: "toAge", Type: code.SimpleType("int")},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorBetween, Field: "Age"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ExpectedCode: `
|
|
|
|
func (r *UserRepositoryMongo) FindByAgeBetween(ctx context.Context, arg0 int, arg1 int) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"age": bson.M{"$gte": arg0, "$lte": arg1},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
`,
|
2021-01-19 12:35:54 +00:00
|
|
|
},
|
2021-01-23 13:03:16 +00:00
|
|
|
{
|
|
|
|
Name: "find with In comparator",
|
|
|
|
MethodSpec: spec.MethodSpec{
|
|
|
|
Name: "FindByGenderIn",
|
|
|
|
Params: []code.Param{
|
|
|
|
{Name: "ctx", Type: code.ExternalType{PackageAlias: "context", Name: "Context"}},
|
|
|
|
{Name: "gender", Type: code.ArrayType{ContainedType: code.SimpleType("Gender")}},
|
|
|
|
},
|
|
|
|
Returns: []code.Type{
|
|
|
|
code.ArrayType{ContainedType: code.PointerType{ContainedType: code.SimpleType("UserModel")}},
|
|
|
|
code.SimpleType("error"),
|
|
|
|
},
|
|
|
|
Operation: spec.FindOperation{
|
|
|
|
Mode: spec.QueryModeMany,
|
|
|
|
Query: spec.QuerySpec{
|
|
|
|
Predicates: []spec.Predicate{
|
|
|
|
{Comparator: spec.ComparatorIn, Field: "Gender"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ExpectedCode: `
|
2021-01-22 02:56:30 +00:00
|
|
|
func (r *UserRepositoryMongo) FindByGenderIn(ctx context.Context, arg0 []Gender) ([]*UserModel, error) {
|
|
|
|
cursor, err := r.collection.Find(ctx, bson.M{
|
|
|
|
"gender": bson.M{"$in": arg0},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
var entities []*UserModel
|
|
|
|
if err := cursor.All(ctx, &entities); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return entities, nil
|
|
|
|
}
|
2021-01-23 13:03:16 +00:00
|
|
|
`,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, testCase := range testTable {
|
|
|
|
t.Run(testCase.Name, func(t *testing.T) {
|
|
|
|
userModel := code.Struct{
|
|
|
|
Name: "UserModel",
|
|
|
|
Fields: code.StructFields{
|
|
|
|
{
|
|
|
|
Name: "ID",
|
|
|
|
Type: code.ExternalType{PackageAlias: "primitive", Name: "ObjectID"},
|
|
|
|
Tags: map[string][]string{"bson": {"_id", "omitempty"}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Username",
|
|
|
|
Type: code.SimpleType("string"),
|
|
|
|
Tags: map[string][]string{"bson": {"username"}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Gender",
|
|
|
|
Type: code.SimpleType("Gender"),
|
|
|
|
Tags: map[string][]string{"bson": {"gender"}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "Age",
|
|
|
|
Type: code.SimpleType("int"),
|
|
|
|
Tags: map[string][]string{"bson": {"age"}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
generator := mongo.NewGenerator(userModel, "UserRepository")
|
|
|
|
buffer := new(bytes.Buffer)
|
|
|
|
|
|
|
|
err := generator.GenerateMethod(testCase.MethodSpec, buffer)
|
2021-01-17 03:29:50 +00:00
|
|
|
|
2021-01-23 13:03:16 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
if err := testutils.ExpectMultiLineString(testCase.ExpectedCode, buffer.String()); err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
})
|
2021-01-17 03:29:50 +00:00
|
|
|
}
|
|
|
|
}
|