Skip to content

Commit

Permalink
fix RPC engine work with ListFlags method
Browse files Browse the repository at this point in the history
Fixes the following conversion problem for BlockedUser:

```
panic: interface conversion: interface {} is map[string]interface {},
not store.BlockedUser [recovered]
```

Resolves #1475.
  • Loading branch information
paskal committed Sep 28, 2022
1 parent a6a9270 commit be342a7
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 10 deletions.
49 changes: 43 additions & 6 deletions backend/_example/memory_store/server/data_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,25 +198,62 @@ func TestRPC_listFlagsHndl(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, "123456", id)

flagReq := engine.FlagRequest{
// verify user
verifyFlagReq := engine.FlagRequest{
Flag: engine.Verified,
UserID: "u1",
Locator: store.Locator{
SiteID: "test-site",
},
}
flags, err := re.ListFlags(flagReq)
flags, err := re.ListFlags(verifyFlagReq)
require.NoError(t, err)
assert.Equal(t, []interface{}{}, flags)
assert.Empty(t, flags)

flagReq.Update = engine.FlagTrue
status, err := re.Flag(flagReq)
verifyFlagReq.Update = engine.FlagTrue
status, err := re.Flag(verifyFlagReq)
require.NoError(t, err)
assert.Equal(t, true, status)

flags, err = re.ListFlags(flagReq)
flags, err = re.ListFlags(verifyFlagReq)
require.NoError(t, err)
assert.Equal(t, []interface{}{"u1"}, flags)
var verifiedUsers []string
for _, v := range flags {
verifiedUsers = append(verifiedUsers, v.(string))
}
assert.Equal(t, []string{"u1"}, verifiedUsers)

// block user
blockFlagReq := engine.FlagRequest{
Flag: engine.Blocked,
UserID: "u1",
Locator: store.Locator{
SiteID: "test-site",
},
TTL: time.Hour,
}
flags, err = re.ListFlags(blockFlagReq)
require.NoError(t, err)
assert.Empty(t, flags)

blockFlagReq.Update = engine.FlagTrue
status, err = re.Flag(blockFlagReq)
require.NoError(t, err)
assert.Equal(t, true, status)

flags, err = re.ListFlags(blockFlagReq)
require.NoError(t, err)
assert.NotEmpty(t, flags)
var blockedUsers []store.BlockedUser
for _, v := range flags {
blockedUsers = append(blockedUsers, v.(store.BlockedUser))
}
require.Equal(t, 1, len(blockedUsers))
blockedUserInfo := blockedUsers[0]
assert.Equal(t, "u1", blockedUserInfo.ID)
assert.True(t, blockedUserInfo.Until.After(time.Now().Add(time.Minute*59)), "blocked duration is more than 59m away")
assert.True(t, blockedUserInfo.Until.Before(time.Now().Add(time.Minute*61)), "blocked duration is less than 61m away")
}

func TestRPC_userDetailHndl(t *testing.T) {
Expand Down
36 changes: 33 additions & 3 deletions backend/app/store/engine/remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,44 @@ func (r *RPC) Flag(req FlagRequest) (status bool, err error) {
return status, err
}

func unmarshalString(data []byte) ([]interface{}, error) {
var strings []string
if err := json.Unmarshal(data, &strings); err != nil {
return nil, err
}
list := make([]interface{}, 0, len(strings))
for _, w := range strings {
list = append(list, w)
}
return list, nil
}

func unmarshalBlockedUser(data []byte) ([]interface{}, error) {
var blockedUsers []store.BlockedUser
if err := json.Unmarshal(data, &blockedUsers); err != nil {
return nil, err
}
list := make([]interface{}, 0, len(blockedUsers))
for _, w := range blockedUsers {
list = append(list, w)
}
return list, nil
}

// ListFlags get list of flagged keys, like blocked & verified user
func (r *RPC) ListFlags(req FlagRequest) (list []interface{}, err error) {
func (r *RPC) ListFlags(req FlagRequest) ([]interface{}, error) {
resp, err := r.Call("store.list_flags", req)
if err != nil {
return nil, err
}
err = json.Unmarshal(*resp.Result, &list)
return list, err
// try []store.BlockedUser
list, err := unmarshalBlockedUser(*resp.Result)
if err == nil {
return list, err
}

// try []strings
return unmarshalString(*resp.Result)
}

// UserDetail sets or gets single detail value, or gets all details for requested site.
Expand Down
8 changes: 7 additions & 1 deletion backend/app/store/engine/remote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,13 @@ func TestRemote_ListFlag(t *testing.T) {
c := RPC{Client: jrpc.Client{API: ts.URL, Client: http.Client{}}}
res, err := c.ListFlags(FlagRequest{Locator: store.Locator{SiteID: "site_id"}, Flag: Blocked})
assert.NoError(t, err)
assert.Equal(t, []interface{}{map[string]interface{}{"ID": "id1"}, map[string]interface{}{"ID": "id2"}}, res)
require.Equal(t, 2, len(res))
var blockedUsers []store.BlockedUser
for _, v := range res {
blockedUsers = append(blockedUsers, v.(store.BlockedUser))
}
assert.Equal(t, 2, len(blockedUsers))
assert.Equal(t, []store.BlockedUser{{ID: "id1"}, {ID: "id2"}}, blockedUsers)
}

func TestRemote_UserDetail(t *testing.T) {
Expand Down

0 comments on commit be342a7

Please sign in to comment.