Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions service/integration/attribute_values_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,91 @@ func (s *AttributeValuesSuite) Test_ListAttributeValues_Offset_Succeeds() {
}
}

func (s *AttributeValuesSuite) Test_ListAttributeValues_AttributeDefID_Succeeds() {
// Create a namespace
ns, err := s.db.PolicyClient.CreateNamespace(s.ctx, &namespaces.CreateNamespaceRequest{
Name: "test-pagination.com",
})
s.Require().NoError(err)
s.NotNil(ns)
s.namespaces = append(s.namespaces, ns)

// Create an attribute definition
attr, err := s.db.PolicyClient.CreateAttribute(s.ctx, &attributes.CreateAttributeRequest{
Name: "test-attr-pagination",
NamespaceId: ns.GetId(),
Rule: policy.AttributeRuleTypeEnum_ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF,
})
s.Require().NoError(err)
s.NotNil(attr)

// Create multiple attribute values
expectedValues := make([]string, 5)
createdValueIDs := make([]string, 5)
for i := 0; i < 5; i++ {
value := fmt.Sprintf("test-value-%d", i+1)
expectedValues[i] = value

req := &attributes.CreateAttributeValueRequest{
Value: value,
}
createdValue, err := s.db.PolicyClient.CreateAttributeValue(s.ctx, attr.GetId(), req)
s.Require().NoError(err)
s.NotNil(createdValue)
createdValueIDs[i] = createdValue.GetId()
s.Equal(value, createdValue.GetValue())
}

// Test listing all values without pagination
listRsp, err := s.db.PolicyClient.ListAttributeValues(s.ctx, &attributes.ListAttributeValuesRequest{
AttributeId: attr.GetId(),
State: common.ActiveStateEnum_ACTIVE_STATE_ENUM_ACTIVE,
})
s.Require().NoError(err)
s.NotNil(listRsp)
s.Len(listRsp.GetValues(), 5)

// Verify all created values are in the response
foundValues := make(map[string]bool)
for _, val := range listRsp.GetValues() {
foundValues[val.GetValue()] = true
s.Equal(attr.GetId(), val.GetAttribute().GetId())
}
for _, expectedValue := range expectedValues {
s.True(foundValues[expectedValue], "Expected value %s not found in list", expectedValue)
}
s.Require().Equal(int32(5), listRsp.GetPagination().GetTotal())
s.Require().Equal(int32(0), listRsp.GetPagination().GetCurrentOffset())
s.Require().Equal(int32(0), listRsp.GetPagination().GetNextOffset())

// Deactivate one of the attribute values
deactivated, err := s.db.PolicyClient.DeactivateAttributeValue(s.ctx, createdValueIDs[2]) // deactivate "test-value-3"
s.Require().NoError(err)
s.Require().NotNil(deactivated)
s.Require().False(deactivated.GetActive().GetValue())

// Test listing only active values after deactivation
activeListRsp, err := s.db.PolicyClient.ListAttributeValues(s.ctx, &attributes.ListAttributeValuesRequest{
AttributeId: attr.GetId(),
State: common.ActiveStateEnum_ACTIVE_STATE_ENUM_ACTIVE,
})
s.Require().NoError(err)
s.NotNil(activeListRsp)
s.Len(activeListRsp.GetValues(), 4) // should be 4 active values now

// Verify that the deactivated value is not in the active list
activeFoundValues := make(map[string]bool)
for _, val := range activeListRsp.GetValues() {
activeFoundValues[val.GetValue()] = true
s.True(val.GetActive().GetValue(), "All values in active list should be active")
s.Equal(attr.GetId(), val.GetAttribute().GetId())
}
s.False(activeFoundValues["test-value-3"], "Deactivated value should not be in active list")
s.Require().Equal(int32(4), activeListRsp.GetPagination().GetTotal())
s.Require().Equal(int32(0), listRsp.GetPagination().GetCurrentOffset())
s.Require().Equal(int32(0), listRsp.GetPagination().GetNextOffset())
}

func (s *AttributeValuesSuite) Test_GetAttributeValue() {
f := s.f.GetAttributeValueKey("example.com/attr/attr1/value/value1")

Expand Down
79 changes: 79 additions & 0 deletions service/integration/attributes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,85 @@ func (s *AttributesSuite) Test_ListAttributes_ByNamespaceIdOrName() {
}
}

func (s *AttributesSuite) Test_ListAttributes_MultipleAttributes_Succeeds() {
// Create two test namespaces
createdNS := make([]*policy.Namespace, 2)
ns1, err := s.db.PolicyClient.CreateNamespace(s.ctx, &namespaces.CreateNamespaceRequest{
Name: "test-list-ns1.com",
})
s.Require().NoError(err)
s.NotNil(ns1)
createdNS[0] = ns1

ns2, err := s.db.PolicyClient.CreateNamespace(s.ctx, &namespaces.CreateNamespaceRequest{
Name: "test-list-ns2.com",
})
s.Require().NoError(err)
s.NotNil(ns2)
createdNS[1] = ns2

// Cleanup function
defer func() {
// Delete namespaces (this will cascade delete attributes)
for _, ns := range createdNS {
_, err := s.db.PolicyClient.UnsafeDeleteNamespace(s.ctx, ns, ns.GetFqn())
s.Require().NoError(err)
}
}()

// Create one attribute in each namespace
attr1, err := s.db.PolicyClient.CreateAttribute(s.ctx, &attributes.CreateAttributeRequest{
Name: "test_attr_1",
NamespaceId: ns1.GetId(),
Rule: policy.AttributeRuleTypeEnum_ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF,
Values: []string{"value1", "value2"},
})
s.Require().NoError(err)
s.NotNil(attr1)

attr2, err := s.db.PolicyClient.CreateAttribute(s.ctx, &attributes.CreateAttributeRequest{
Name: "test_attr_2",
NamespaceId: ns2.GetId(),
Rule: policy.AttributeRuleTypeEnum_ATTRIBUTE_RULE_TYPE_ENUM_ANY_OF,
Values: []string{"valueA", "valueB"},
})
s.Require().NoError(err)
s.NotNil(attr2)

// Test 1: List attributes from first namespace
listReq := &attributes.ListAttributesRequest{
State: common.ActiveStateEnum_ACTIVE_STATE_ENUM_ACTIVE,
Namespace: ns1.GetId(),
}
listResp, err := s.db.PolicyClient.ListAttributes(s.ctx, listReq)
s.Require().NoError(err)
s.NotNil(listResp)

listedAttrs := listResp.GetAttributes()
s.Require().Len(listedAttrs, 1, "Should list one attribute from first namespace")
s.Require().Equal(attr1.GetId(), listedAttrs[0].GetId())
s.Require().Equal(ns1.GetId(), listedAttrs[0].GetNamespace().GetId())
s.Require().NotEmpty(listedAttrs[0].GetFqn())
s.Require().Equal(int32(1), listResp.GetPagination().GetTotal())
s.Require().Equal(int32(0), listResp.GetPagination().GetNextOffset())
s.Require().Equal(int32(0), listResp.GetPagination().GetCurrentOffset())

// Test 2: List attributes from second namespace
listReq.Namespace = ns2.GetId()
listResp, err = s.db.PolicyClient.ListAttributes(s.ctx, listReq)
s.Require().NoError(err)
s.NotNil(listResp)

listedAttrs = listResp.GetAttributes()
s.Require().Len(listedAttrs, 1, "Should list one attribute from second namespace")
s.Require().Equal(attr2.GetId(), listedAttrs[0].GetId())
s.Require().Equal(ns2.GetId(), listedAttrs[0].GetNamespace().GetId())
s.Require().NotEmpty(listedAttrs[0].GetFqn())
s.Require().Equal(int32(1), listResp.GetPagination().GetTotal())
s.Require().Equal(int32(0), listResp.GetPagination().GetNextOffset())
s.Require().Equal(int32(0), listResp.GetPagination().GetCurrentOffset())
}

func (s *AttributesSuite) Test_UpdateAttribute() {
fixedLabel := "fixed label"
updateLabel := "update label"
Expand Down
Loading
Loading