Skip to content
Snippets Groups Projects
Commit c542d56b authored by ko_oler's avatar ko_oler
Browse files

добавлена обработка bson

parent 2d9030bc
No related branches found
No related tags found
No related merge requests found
package id
import (
"fmt"
"git.perx.ru/perxis/perxis-go/pkg/errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/bsonrw"
"go.mongodb.org/mongo-driver/bson/bsontype"
)
//func (id *ID) MarshalBSON() ([]byte, error) {
// return bson.Marshal(id.String())
//}
func (id *ID) MarshalBSONValue() (bsontype.Type, []byte, error) {
data := id.String()
return bson.MarshalValue(data)
}
func (id *ID) UnmarshalBSONValue(btype bsontype.Type, data []byte) error {
if btype != bson.TypeString {
return errors.New("cannot unmarshal non-string bson value to MyTime")
}
dec, err := bson.NewDecoder(bsonrw.NewBSONValueReader(btype, data))
if err != nil {
return err
}
fmt.Println(string(data))
var str string
if err = dec.Decode(&str); err != nil {
return err
}
t, err := Parse(str)
if err != nil {
return err
}
*id = *t
return nil
}
package id
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.mongodb.org/mongo-driver/bson"
)
func TestID_MarshalBSON(t *testing.T) {
tests := []struct {
name string
id ID
want string
}{
{
name: "OrganizationID",
id: ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
want: `"/orgs/1"`,
},
{
name: "UserID",
id: ID{Descriptor: &UserID{UserID: "1"}},
want: `"/users/1"`,
},
{
name: "ServiceID",
id: ID{Descriptor: &ServiceID{ServiceID: "1"}},
want: `"/services/1"`,
},
{
name: "SpaceID",
id: ID{Descriptor: &SpaceID{SpaceID: "1"}},
want: `"/spaces/1"`,
},
{
name: "EnvironmentID",
id: ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
want: `"/spaces/1/envs/1"`,
},
{
name: "ClientID",
id: ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
want: `"/spaces/1/clients/1"`,
},
{
name: "RoleID",
id: ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
want: `"/spaces/1/roles/1"`,
},
{
name: "CollectionID",
id: ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
want: `"/spaces/1/envs/1/cols/1"`,
},
{
name: "SchemaID",
id: ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
want: `"/spaces/1/envs/1/schema/1"`,
},
{
name: "ItemID",
id: ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
want: `"/spaces/1/envs/1/cols/1/items/1"`,
},
{
name: "RevisionID",
id: ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
want: `"/spaces/1/envs/1/cols/1/items/1/revs/1"`,
},
{
name: "FieldID",
id: ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
want: `"/spaces/1/envs/1/cols/1/items/1/fields/1"`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := bson.Marshal(tt.id)
require.NoError(t, err)
assert.Equal(t, tt.want, string(got))
})
}
}
func TestID_UnmarshalBSON(t *testing.T) {
tests := []struct {
id string
want ID
b []byte
}{
{
id: "OrganizationID",
want: ID{Descriptor: &OrganizationID{OrganizationID: "1"}},
b: []byte(`"/orgs/1"`),
},
{
id: "UserID",
want: ID{Descriptor: &UserID{UserID: "1"}},
b: []byte(`"/users/1"`),
},
{
id: "ServiceID",
want: ID{Descriptor: &ServiceID{ServiceID: "1"}},
b: []byte(`"/services/1"`),
},
{
id: "SpaceID",
want: ID{Descriptor: &SpaceID{SpaceID: "1"}},
b: []byte(`"/spaces/1"`),
},
{
id: "EnvironmentID",
want: ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
b: []byte(`"/spaces/1/envs/1"`),
},
{
id: "ClientID",
want: ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
b: []byte(`"/spaces/1/clients/1"`),
},
{
id: "RoleID",
want: ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}},
b: []byte(`"/spaces/1/roles/1"`),
},
{
id: "CollectionID",
want: ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
b: []byte(`"/spaces/1/envs/1/cols/1"`),
},
{
id: "SchemaID",
want: ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}},
b: []byte(`"/spaces/1/envs/1/schema/1"`),
},
{
id: "ItemID",
want: ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}},
b: []byte(`"/spaces/1/envs/1/cols/1/items/1"`),
},
{
id: "RevisionID",
want: ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
b: []byte(`"/spaces/1/envs/1/cols/1/items/1/revs/1"`),
},
{
id: "FieldID",
want: ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}},
b: []byte(`"/spaces/1/envs/1/cols/1/items/1/fields/1"`),
},
}
for _, tt := range tests {
t.Run(tt.id, func(t *testing.T) {
var i ID
//require.NoError(t, i.UnmarshalBSON(tt.b))
assert.Equal(t, tt.want, i)
})
}
}
func TestID_BSON(t *testing.T) {
type data struct {
ID *ID
Text string
Number int
}
test1 := &data{
ID: &ID{Descriptor: &SpaceID{SpaceID: Space}},
Text: "text",
Number: 1,
}
b, err := bson.Marshal(test1)
require.NoError(t, err)
str := string(b)
_ = str
test2 := new(data)
err = bson.Unmarshal(b, &test2)
require.NoError(t, err)
assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным")
test1 = &data{
ID: &ID{Descriptor: &OrganizationID{OrganizationID: Organization}},
Text: "text2",
Number: 2,
}
b, err = bson.Marshal(test1)
require.NoError(t, err)
test2 = new(data)
err = bson.Unmarshal(b, &test2)
require.NoError(t, err)
assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным")
}
......@@ -7,7 +7,7 @@ const (
type ClientID struct {
SpaceID
ClientID string `json:"client_id"`
ClientID string `json:"client_id,omitempty" bson:"client_id,omitempty"`
}
func (t *ClientID) Type() string { return Client }
......
......@@ -7,7 +7,7 @@ const (
type CollectionID struct {
EnvironmentID
CollectionID string `json:"col_id"`
CollectionID string `json:"col_id,omitempty" bson:"col_id, omitempty"`
}
func (t *CollectionID) Type() string { return Collection }
......
......@@ -7,7 +7,7 @@ const (
type EnvironmentID struct {
SpaceID
EnvironmentID string `json:"env_id"`
EnvironmentID string `json:"env_id,omitempty" bson:"env_id,omitempty"`
}
func (t *EnvironmentID) Type() string { return Environment }
......
......@@ -7,7 +7,7 @@ const (
type FieldID struct {
ItemID
FieldName string `json:"field_name"`
FieldName string `json:"field_name,omitempty" bson:"field_name,omitempty"`
}
func (t *FieldID) Type() string { return Field }
......
......@@ -124,7 +124,7 @@ func (id *ID) FromMap(m map[string]any) error {
case Field:
id.Descriptor = new(FieldID)
default:
return errors.New("type of ID not specified in map")
return errors.New("unknown type")
}
_ = id.Descriptor.FromMap(m)
return nil
......
......@@ -7,7 +7,7 @@ const (
type ItemID struct {
CollectionID
ItemID string `json:"item_id"`
ItemID string `json:"item_id,omitempty" bson:"item_id,omitempty"`
}
func (t *ItemID) Type() string { return Item }
......
......@@ -154,7 +154,8 @@ func TestID_UnmarshalJSON(t *testing.T) {
for _, tt := range tests {
t.Run(tt.id, func(t *testing.T) {
var i ID
require.NoError(t, i.UnmarshalJSON(tt.b))
err := jsoniter.Unmarshal(tt.b, &i)
require.NoError(t, err)
assert.Equal(t, tt.want, i)
})
}
......@@ -175,7 +176,6 @@ func TestID_JSON(t *testing.T) {
b, err := jsoniter.Marshal(test1)
require.NoError(t, err)
assert.Equal(t, string(b), "{\"ID\":\"/spaces/space\",\"Text\":\"text\",\"Number\":1}", "проверяем корректность Marshal данных")
test2 := new(data)
err = jsoniter.Unmarshal(b, &test2)
......@@ -190,7 +190,6 @@ func TestID_JSON(t *testing.T) {
b, err = jsoniter.Marshal(test1)
require.NoError(t, err)
assert.Equal(t, string(b), "{\"ID\":\"/orgs/organization\",\"Text\":\"text2\",\"Number\":2}", "проверяем корректность Marshal данных")
test2 = new(data)
err = jsoniter.Unmarshal(b, &test2)
......
......@@ -6,7 +6,7 @@ const (
)
type OrganizationID struct {
OrganizationID string `json:"organization_id"`
OrganizationID string `json:"organization_id,omitempty" bson:"organization_id,omitempty"`
}
func (t *OrganizationID) Type() string { return Organization }
......
......@@ -7,7 +7,7 @@ const (
type RevisionID struct {
ItemID
RevisionID string `json:"rev_id"`
RevisionID string `json:"rev_id" bson:"rev_id,omitempty"`
}
func (t *RevisionID) Type() string { return Revision }
......
......@@ -7,7 +7,7 @@ const (
type RoleID struct {
SpaceID
RoleID string `json:"role_id"`
RoleID string `json:"role_id,omitempty" bson:"role_id,omitempty"`
}
func (t *RoleID) Type() string { return Role }
......
......@@ -7,7 +7,7 @@ const (
type SchemaID struct {
EnvironmentID
CollectionID string `json:"col_id"`
CollectionID string `json:"col_id" bson:"col_id,omitempty"`
}
func (t *SchemaID) Type() string { return Schema }
......
......@@ -6,7 +6,7 @@ const (
)
type ServiceID struct {
ServiceID string `json:"service_id"`
ServiceID string `json:"service_id,omitempty" bson:"service_id,omitempty"`
}
func (t *ServiceID) Type() string { return Service }
......
......@@ -6,7 +6,7 @@ const (
)
type SpaceID struct {
SpaceID string `json:"space_id"`
SpaceID string `json:"space_id,omitempty" bson:"space_id,omitempty"`
}
func (t *SpaceID) Type() string { return Space }
......
......@@ -6,7 +6,7 @@ const (
)
type UserID struct {
UserID string `json:"user_id"`
UserID string `json:"user_id,omitempty" bson:"user_id,omitempty"`
}
func (t *UserID) Type() string { return User }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment