mirror of
https://github.com/hay-kot/homebox.git
synced 2024-11-28 19:45:41 +00:00
refactor display + marshal/unmarshal
This commit is contained in:
parent
e7eee7a129
commit
9192f2e5f9
4 changed files with 148 additions and 55 deletions
30
backend/internal/data/repo/asset_id_type.go
Normal file
30
backend/internal/data/repo/asset_id_type.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package repo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AssetID int
|
||||||
|
|
||||||
|
func (aid AssetID) MarshalJSON() ([]byte, error) {
|
||||||
|
aidStr := fmt.Sprintf("%06d", aid)
|
||||||
|
aidStr = fmt.Sprintf("%s-%s", aidStr[:3], aidStr[3:])
|
||||||
|
return []byte(fmt.Sprintf(`"%s"`, aidStr)), nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (aid *AssetID) UnmarshalJSON(d []byte) error {
|
||||||
|
d = bytes.Replace(d, []byte(`"`), []byte(``), -1)
|
||||||
|
d = bytes.Replace(d, []byte(`-`), []byte(``), -1)
|
||||||
|
|
||||||
|
aidInt, err := strconv.Atoi(string(d))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
*aid = AssetID(aidInt)
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
115
backend/internal/data/repo/asset_id_type_test.go
Normal file
115
backend/internal/data/repo/asset_id_type_test.go
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
package repo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAssetID_MarshalJSON(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
aid AssetID
|
||||||
|
want []byte
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "basic test",
|
||||||
|
aid: 123,
|
||||||
|
want: []byte(`"000-123"`),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "zero test",
|
||||||
|
aid: 0,
|
||||||
|
want: []byte(`"000-000"`),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "large int",
|
||||||
|
aid: 123456789,
|
||||||
|
want: []byte(`"123-456789"`),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := tt.aid.MarshalJSON()
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("AssetID.MarshalJSON() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("AssetID.MarshalJSON() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAssetID_UnmarshalJSON(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
data []byte
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
aid *AssetID
|
||||||
|
args args
|
||||||
|
want AssetID
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "basic test",
|
||||||
|
aid: new(AssetID),
|
||||||
|
want: 123,
|
||||||
|
args: args{
|
||||||
|
data: []byte(`{"AssetID":"000123"}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "dashed format",
|
||||||
|
aid: new(AssetID),
|
||||||
|
want: 123,
|
||||||
|
args: args{
|
||||||
|
data: []byte(`{"AssetID":"000-123"}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no leading zeros",
|
||||||
|
aid: new(AssetID),
|
||||||
|
want: 123,
|
||||||
|
args: args{
|
||||||
|
data: []byte(`{"AssetID":"123"}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "trailing zeros",
|
||||||
|
aid: new(AssetID),
|
||||||
|
want: 123000,
|
||||||
|
args: args{
|
||||||
|
data: []byte(`{"AssetID":"000123000"}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "large int",
|
||||||
|
aid: new(AssetID),
|
||||||
|
want: 123456789,
|
||||||
|
args: args{
|
||||||
|
data: []byte(`{"AssetID":"123456789"}`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
st := struct {
|
||||||
|
AssetID AssetID `json:"AssetID"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
err := json.Unmarshal(tt.args.data, &st)
|
||||||
|
if (err != nil) != tt.wantErr {
|
||||||
|
t.Errorf("AssetID.UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if st.AssetID != tt.want {
|
||||||
|
t.Errorf("AssetID.UnmarshalJSON() = %v, want %v", st.AssetID, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,9 +2,6 @@ package repo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
@ -21,30 +18,6 @@ type ItemsRepository struct {
|
||||||
db *ent.Client
|
db *ent.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
type AssetID int
|
|
||||||
|
|
||||||
func (aid AssetID) MarshalJSON() ([]byte, error) {
|
|
||||||
str := fmt.Sprintf("%d", aid)
|
|
||||||
|
|
||||||
for len(str) < 6 {
|
|
||||||
str = "0" + str
|
|
||||||
}
|
|
||||||
|
|
||||||
return []byte(fmt.Sprintf(`"%s"`, str)), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (aid *AssetID) UnmarshalJSON(data []byte) error {
|
|
||||||
str := string(strings.Replace(string(data), `"`, "", -1))
|
|
||||||
aidInt, err := strconv.Atoi(str)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
*aid = AssetID(aidInt)
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
type (
|
type (
|
||||||
ItemQuery struct {
|
ItemQuery struct {
|
||||||
Page int
|
Page int
|
||||||
|
@ -410,6 +383,9 @@ func (e *ItemsRepository) GetHighestAssetID(ctx context.Context, GID uuid.UUID)
|
||||||
|
|
||||||
result, err := q.First(ctx)
|
result, err := q.First(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if ent.IsNotFound(err) {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ package repo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -10,33 +9,6 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAssetID_UnmarshalJSON(t *testing.T) {
|
|
||||||
rawjson := `{"aid":"000123"}`
|
|
||||||
|
|
||||||
st := struct {
|
|
||||||
AID AssetID `json:"aid"`
|
|
||||||
}{
|
|
||||||
AID: AssetID(0),
|
|
||||||
}
|
|
||||||
|
|
||||||
err := json.Unmarshal([]byte(rawjson), &st)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, AssetID(123), st.AID)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAssetID_MarshalJSON(t *testing.T) {
|
|
||||||
st := struct {
|
|
||||||
AID AssetID `json:"aid"`
|
|
||||||
}{
|
|
||||||
AID: AssetID(123),
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err := json.Marshal(st)
|
|
||||||
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.JSONEq(t, `{"aid":"000123"}`, string(b))
|
|
||||||
}
|
|
||||||
|
|
||||||
func itemFactory() ItemCreate {
|
func itemFactory() ItemCreate {
|
||||||
return ItemCreate{
|
return ItemCreate{
|
||||||
Name: fk.Str(10),
|
Name: fk.Str(10),
|
||||||
|
|
Loading…
Reference in a new issue