diff --git a/id/bson.go b/id/bson.go index 8f8cae7d479e4c6f4770fafe2845f09093b94877..4aa98c09428cc86dde3053c517c0cd0db53c922d 100644 --- a/id/bson.go +++ b/id/bson.go @@ -1,18 +1,12 @@ 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) @@ -20,13 +14,12 @@ func (id *ID) MarshalBSONValue() (bsontype.Type, []byte, error) { 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") + return errors.New("cannot unmarshal non-string bson value to ID") } 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 diff --git a/id/bson_test.go b/id/bson_test.go index 4a7ca5dedbf8842d02b80c035c638c8aa4babcff..952ecf596c23373bd2a7917645b863e03331cc06 100644 --- a/id/bson_test.go +++ b/id/bson_test.go @@ -8,40 +8,96 @@ import ( "go.mongodb.org/mongo-driver/bson" ) -func TestID_BSON(t *testing.T) { +func TestID_MarshalUnmarshalBSON(t *testing.T) { + tests := []struct { + name string + id *ID + }{ + { + name: "OrganizationID", + id: &ID{Descriptor: &OrganizationID{OrganizationID: "1"}}, + }, + { + name: "UserID", + id: &ID{Descriptor: &UserID{UserID: "1"}}, + }, + { + name: "ServiceID", + id: &ID{Descriptor: &ServiceID{ServiceID: "1"}}, + }, + { + name: "SpaceID", + id: &ID{Descriptor: &SpaceID{SpaceID: "1"}}, + }, + { + name: "EnvironmentID", + id: &ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + }, + { + name: "ClientID", + id: &ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + }, + { + name: "RoleID", + id: &ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + }, + { + name: "CollectionID", + id: &ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, + }, + { + name: "SchemaID", + id: &ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, + }, + { + name: "ItemID", + id: &ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "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"}}}}}}, + }, + { + name: "FieldID", + id: &ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}}, + }, + } + type test struct { + Text string + ID *ID + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := &test{Text: tt.name, ID: tt.id} + + b, err := bson.Marshal(s) + require.NoError(t, err) + + var v *test + require.NoError(t, bson.Unmarshal(b, &v)) + assert.Equal(t, s, v, "после Unmarshal объект должен быть идентичен исходному") + }) + } +} + +func TestID_ExampleBSON(t *testing.T) { type data struct { ID *ID Text string Number int } - test1 := &data{ + test := &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) + b, err := bson.Marshal(test) require.NoError(t, err) - test2 = new(data) - err = bson.Unmarshal(b, &test2) + buf := new(data) + err = bson.Unmarshal(b, &buf) require.NoError(t, err) - assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным") + assert.Equal(t, test, buf, "после Unmarshal объект должен совпадать с исходным") } diff --git a/id/id.go b/id/id.go index f580c52f7535bf9f601df0b24c734b774111498c..920b4edba74cd60c9bf62733de553722d22c66f4 100644 --- a/id/id.go +++ b/id/id.go @@ -126,6 +126,9 @@ func (id *ID) FromMap(m map[string]any) error { default: return errors.New("unknown type") } - _ = id.Descriptor.FromMap(m) + if err := id.Descriptor.FromMap(m); err != nil { + return err + } + return nil } diff --git a/id/json_test.go b/id/json_test.go index 8308019dd8dc55b58205c9826325076c5ac96f7f..b67bcb3fd15a366c458df0ac91b96d1e82940eea 100644 --- a/id/json_test.go +++ b/id/json_test.go @@ -8,191 +8,90 @@ import ( "github.com/stretchr/testify/require" ) -func TestID_MarshalJSON(t *testing.T) { +func TestID_MarshalUnmarshalJSON(t *testing.T) { tests := []struct { name string - id ID - want string + id *ID }{ { name: "OrganizationID", - id: ID{Descriptor: &OrganizationID{OrganizationID: "1"}}, - want: `"/orgs/1"`, + id: &ID{Descriptor: &OrganizationID{OrganizationID: "1"}}, }, { name: "UserID", - id: ID{Descriptor: &UserID{UserID: "1"}}, - want: `"/users/1"`, + id: &ID{Descriptor: &UserID{UserID: "1"}}, }, { name: "ServiceID", - id: ID{Descriptor: &ServiceID{ServiceID: "1"}}, - want: `"/services/1"`, + id: &ID{Descriptor: &ServiceID{ServiceID: "1"}}, }, { name: "SpaceID", - id: ID{Descriptor: &SpaceID{SpaceID: "1"}}, - want: `"/spaces/1"`, + id: &ID{Descriptor: &SpaceID{SpaceID: "1"}}, }, { name: "EnvironmentID", - id: ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, - want: `"/spaces/1/envs/1"`, + id: &ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, }, { name: "ClientID", - id: ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, - want: `"/spaces/1/clients/1"`, + id: &ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, }, { name: "RoleID", - id: ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, - want: `"/spaces/1/roles/1"`, + id: &ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, }, { name: "CollectionID", - id: ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, - want: `"/spaces/1/envs/1/cols/1"`, + id: &ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, }, { name: "SchemaID", - id: ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, - want: `"/spaces/1/envs/1/schema/1"`, + id: &ID{Descriptor: &SchemaID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "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"`, + id: &ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "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"`, + id: &ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "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"`, + id: &ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := jsoniter.Marshal(&tt.id) + b, err := jsoniter.Marshal(&tt.id) require.NoError(t, err) - assert.Equal(t, tt.want, string(got)) - }) - } -} -func TestID_UnmarshalJSON(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 - err := jsoniter.Unmarshal(tt.b, &i) - require.NoError(t, err) - assert.Equal(t, tt.want, i) + require.NoError(t, jsoniter.Unmarshal(b, &i)) + assert.Equal(t, tt.id, &i, "после Unmarshal объект должен быть идентичен исходному") }) } } -func TestID_JSON(t *testing.T) { +func TestID_ExampleJSON(t *testing.T) { type data struct { ID *ID Text string Number int } - test1 := &data{ + test := &data{ ID: &ID{Descriptor: &SpaceID{SpaceID: Space}}, Text: "text", Number: 1, } - b, err := jsoniter.Marshal(test1) - require.NoError(t, err) - - test2 := new(data) - err = jsoniter.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 = jsoniter.Marshal(test1) + b, err := jsoniter.Marshal(test) require.NoError(t, err) - test2 = new(data) - err = jsoniter.Unmarshal(b, &test2) + buf := new(data) + err = jsoniter.Unmarshal(b, &test) require.NoError(t, err) - assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным") + assert.Equal(t, test, buf, "после Unmarshal объект должен совпадать с исходным") }