Skip to content

Commit

Permalink
Simulating getById behaviour for entites with only a list endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnSharpe committed Jun 23, 2023
1 parent 033fbfd commit bb37160
Show file tree
Hide file tree
Showing 4 changed files with 345 additions and 2 deletions.
122 changes: 122 additions & 0 deletions redis_rule_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -621,3 +621,125 @@ func TestListRedisRules(t *testing.T) {
}, actual)

}

func TestGetNonExistentRedisRule(t *testing.T) {
server := httptest.NewServer(
testServer(
"key",
"secret",
getRequest(t, "/acl/redisRules", `{
"accountId": 53012,
"redisRules": [
{
"id": 3923,
"name": "ACL-rule-example",
"acl": "+@all",
"isDefault": false,
"status": "active"
},
{
"id": 76,
"name": "Full-Access",
"acl": "+@all ~*",
"isDefault": true,
"status": "active"
},
{
"id": 77,
"name": "Read-Write",
"acl": "+@all -@dangerous ~*",
"isDefault": true,
"status": "active"
},
{
"id": 78,
"name": "Read-Only",
"acl": "+@read ~*",
"isDefault": true,
"status": "active"
}
],
"links": [
{
"rel": "self",
"href": "https://api-cloudapi.qa.redislabs.com/v1/acl/redisRules",
"type": "GET"
}
]
}`),
),
)

subject, err := clientFromTestServer(server, "key", "secret")
require.NoError(t, err)

actual, err := subject.RedisRules.Get(context.TODO(), 40004)

assert.Nil(t, actual)
assert.IsType(t, &redis_rules.NotFound{}, err)

}

func TestGetRedisRule(t *testing.T) {
server := httptest.NewServer(
testServer(
"key",
"secret",
getRequest(t, "/acl/redisRules", `{
"accountId": 53012,
"redisRules": [
{
"id": 3923,
"name": "ACL-rule-example",
"acl": "+@all",
"isDefault": false,
"status": "active"
},
{
"id": 76,
"name": "Full-Access",
"acl": "+@all ~*",
"isDefault": true,
"status": "active"
},
{
"id": 77,
"name": "Read-Write",
"acl": "+@all -@dangerous ~*",
"isDefault": true,
"status": "active"
},
{
"id": 78,
"name": "Read-Only",
"acl": "+@read ~*",
"isDefault": true,
"status": "active"
}
],
"links": [
{
"rel": "self",
"href": "https://api-cloudapi.qa.redislabs.com/v1/acl/redisRules",
"type": "GET"
}
]
}`),
),
)

subject, err := clientFromTestServer(server, "key", "secret")
require.NoError(t, err)

actual, err := subject.RedisRules.Get(context.TODO(), 3923)
require.NoError(t, err)

assert.Equal(t, &redis_rules.GetRedisRuleResponse{
ID: redis.Int(3923),
Name: redis.String("ACL-rule-example"),
ACL: redis.String("+@all"),
IsDefault: redis.Bool(false),
Status: redis.String("active"),
}, actual)

}
193 changes: 193 additions & 0 deletions role_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -716,3 +716,196 @@ func TestListRoles(t *testing.T) {
}, actual)

}

func TestGetNonExistentRole(t *testing.T) {
server := httptest.NewServer(
testServer(
"key",
"secret",
getRequest(t, "/acl/roles", `{
"accountId": 53012,
"roles": [
{
"id": 998,
"name": "ACL-role-example",
"redisRules": [
{
"ruleId": 78,
"ruleName": "Read-Only",
"databases": [
{
"subscriptionId": 156983,
"databaseId": 51332750,
"databaseName": "john-test-database-keen-lab",
"regions": []
}
]
}
],
"users": [],
"status": "active"
},
{
"id": 999,
"name": "ACL-role-another-example",
"redisRules": [
{
"ruleId": 78,
"ruleName": "Read-Only",
"databases": [
{
"subscriptionId": 156983,
"databaseId": 51332750,
"databaseName": "john-test-database-keen-lab",
"regions": []
}
]
}
],
"users": [],
"status": "active"
},
{
"id": 27,
"name": "test-role",
"redisRules": [],
"users": [
{
"id": 24,
"name": "test-user"
}
],
"status": "active"
}
],
"links": [
{
"rel": "self",
"href": "https://api-cloudapi.qa.redislabs.com/v1/acl/roles",
"type": "GET"
}
]
}`),
),
)

subject, err := clientFromTestServer(server, "key", "secret")
require.NoError(t, err)

actual, err := subject.Roles.Get(context.TODO(), 40004)

assert.Nil(t, actual)
assert.IsType(t, &roles.NotFound{}, err)

}

func TestGetRole(t *testing.T) {
server := httptest.NewServer(
testServer(
"key",
"secret",
getRequest(t, "/acl/roles", `{
"accountId": 53012,
"roles": [
{
"id": 998,
"name": "ACL-role-example",
"redisRules": [
{
"ruleId": 78,
"ruleName": "Read-Only",
"databases": [
{
"subscriptionId": 156983,
"databaseId": 51332750,
"databaseName": "john-test-database-keen-lab",
"regions": []
}
]
}
],
"users": [],
"status": "active"
},
{
"id": 999,
"name": "ACL-role-another-example",
"redisRules": [
{
"ruleId": 78,
"ruleName": "Read-Only",
"databases": [
{
"subscriptionId": 156983,
"databaseId": 51332750,
"databaseName": "john-test-database-keen-lab",
"regions": []
}
]
}
],
"users": [
{
"id": 24,
"name": "test-user"
}
],
"status": "active"
},
{
"id": 27,
"name": "test-role",
"redisRules": [],
"users": [
{
"id": 24,
"name": "test-user"
}
],
"status": "active"
}
],
"links": [
{
"rel": "self",
"href": "https://api-cloudapi.qa.redislabs.com/v1/acl/roles",
"type": "GET"
}
]
}`),
),
)

subject, err := clientFromTestServer(server, "key", "secret")
require.NoError(t, err)

actual, err := subject.Roles.Get(context.TODO(), 999)
require.NoError(t, err)

assert.Equal(t, &roles.GetRoleResponse{
ID: redis.Int(999),
Name: redis.String("ACL-role-another-example"),
RedisRules: []*roles.GetRuleInRoleResponse{
{
RuleId: redis.Int(78),
RuleName: redis.String("Read-Only"),
Databases: []*roles.GetDatabaseInRuleInRoleResponse{
{
SubscriptionId: redis.Int(156983),
DatabaseId: redis.Int(51332750),
DatabaseName: redis.String("john-test-database-keen-lab"),
Regions: []*string{},
},
},
},
},
Users: []*roles.GetUserInRoleResponse{
{
ID: redis.Int(24),
Name: redis.String("test-user"),
},
},
Status: redis.String("active"),
}, actual)

}
16 changes: 15 additions & 1 deletion service/access_control_lists/redis_rules/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,21 @@ func (a API) List(ctx context.Context) ([]*GetRedisRuleResponse, error) {
return response.RedisRules, nil
}

// No getById
// Get has to use the List behaviour to simulate getById
func (a API) Get(ctx context.Context, id int) (*GetRedisRuleResponse, error) {
rules, err := a.List(ctx)
if err != nil {
return nil, err
}

for _, rule := range rules {
if id == *rule.ID {
return rule, nil
}
}

return nil, &NotFound{ID: id}
}

// Create will create a new redisRule and return the identifier of the redisRule.
func (a *API) Create(ctx context.Context, redisRule CreateRedisRuleRequest) (int, error) {
Expand Down
16 changes: 15 additions & 1 deletion service/access_control_lists/roles/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,21 @@ func (a API) List(ctx context.Context) ([]*GetRoleResponse, error) {
return response.Roles, nil
}

// No getById
// Get has to use the List behaviour to simulate getById
func (a API) Get(ctx context.Context, id int) (*GetRoleResponse, error) {
roles, err := a.List(ctx)
if err != nil {
return nil, err
}

for _, role := range roles {
if id == *role.ID {
return role, nil
}
}

return nil, &NotFound{ID: id}
}

// Create will create a new role and return the identifier of the role.
func (a *API) Create(ctx context.Context, role CreateRoleRequest) (int, error) {
Expand Down

0 comments on commit bb37160

Please sign in to comment.