@@ -205,6 +205,91 @@ func (s *AttributeValuesSuite) Test_ListAttributeValues_Offset_Succeeds() {
205205 }
206206}
207207
208+ func (s * AttributeValuesSuite ) Test_ListAttributeValues_AttributeDefID_Succeeds () {
209+ // Create a namespace
210+ ns , err := s .db .PolicyClient .CreateNamespace (s .ctx , & namespaces.CreateNamespaceRequest {
211+ Name : "test-pagination.com" ,
212+ })
213+ s .Require ().NoError (err )
214+ s .NotNil (ns )
215+ s .namespaces = append (s .namespaces , ns )
216+
217+ // Create an attribute definition
218+ attr , err := s .db .PolicyClient .CreateAttribute (s .ctx , & attributes.CreateAttributeRequest {
219+ Name : "test-attr-pagination" ,
220+ NamespaceId : ns .GetId (),
221+ Rule : policy .AttributeRuleTypeEnum_ATTRIBUTE_RULE_TYPE_ENUM_ALL_OF ,
222+ })
223+ s .Require ().NoError (err )
224+ s .NotNil (attr )
225+
226+ // Create multiple attribute values
227+ expectedValues := make ([]string , 5 )
228+ createdValueIDs := make ([]string , 5 )
229+ for i := 0 ; i < 5 ; i ++ {
230+ value := fmt .Sprintf ("test-value-%d" , i + 1 )
231+ expectedValues [i ] = value
232+
233+ req := & attributes.CreateAttributeValueRequest {
234+ Value : value ,
235+ }
236+ createdValue , err := s .db .PolicyClient .CreateAttributeValue (s .ctx , attr .GetId (), req )
237+ s .Require ().NoError (err )
238+ s .NotNil (createdValue )
239+ createdValueIDs [i ] = createdValue .GetId ()
240+ s .Equal (value , createdValue .GetValue ())
241+ }
242+
243+ // Test listing all values without pagination
244+ listRsp , err := s .db .PolicyClient .ListAttributeValues (s .ctx , & attributes.ListAttributeValuesRequest {
245+ AttributeId : attr .GetId (),
246+ State : common .ActiveStateEnum_ACTIVE_STATE_ENUM_ACTIVE ,
247+ })
248+ s .Require ().NoError (err )
249+ s .NotNil (listRsp )
250+ s .Len (listRsp .GetValues (), 5 )
251+
252+ // Verify all created values are in the response
253+ foundValues := make (map [string ]bool )
254+ for _ , val := range listRsp .GetValues () {
255+ foundValues [val .GetValue ()] = true
256+ s .Equal (attr .GetId (), val .GetAttribute ().GetId ())
257+ }
258+ for _ , expectedValue := range expectedValues {
259+ s .True (foundValues [expectedValue ], "Expected value %s not found in list" , expectedValue )
260+ }
261+ s .Require ().Equal (int32 (5 ), listRsp .GetPagination ().GetTotal ())
262+ s .Require ().Equal (int32 (0 ), listRsp .GetPagination ().GetCurrentOffset ())
263+ s .Require ().Equal (int32 (0 ), listRsp .GetPagination ().GetNextOffset ())
264+
265+ // Deactivate one of the attribute values
266+ deactivated , err := s .db .PolicyClient .DeactivateAttributeValue (s .ctx , createdValueIDs [2 ]) // deactivate "test-value-3"
267+ s .Require ().NoError (err )
268+ s .Require ().NotNil (deactivated )
269+ s .Require ().False (deactivated .GetActive ().GetValue ())
270+
271+ // Test listing only active values after deactivation
272+ activeListRsp , err := s .db .PolicyClient .ListAttributeValues (s .ctx , & attributes.ListAttributeValuesRequest {
273+ AttributeId : attr .GetId (),
274+ State : common .ActiveStateEnum_ACTIVE_STATE_ENUM_ACTIVE ,
275+ })
276+ s .Require ().NoError (err )
277+ s .NotNil (activeListRsp )
278+ s .Len (activeListRsp .GetValues (), 4 ) // should be 4 active values now
279+
280+ // Verify that the deactivated value is not in the active list
281+ activeFoundValues := make (map [string ]bool )
282+ for _ , val := range activeListRsp .GetValues () {
283+ activeFoundValues [val .GetValue ()] = true
284+ s .True (val .GetActive ().GetValue (), "All values in active list should be active" )
285+ s .Equal (attr .GetId (), val .GetAttribute ().GetId ())
286+ }
287+ s .False (activeFoundValues ["test-value-3" ], "Deactivated value should not be in active list" )
288+ s .Require ().Equal (int32 (4 ), activeListRsp .GetPagination ().GetTotal ())
289+ s .Require ().Equal (int32 (0 ), activeListRsp .GetPagination ().GetCurrentOffset ())
290+ s .Require ().Equal (int32 (0 ), activeListRsp .GetPagination ().GetNextOffset ())
291+ }
292+
208293func (s * AttributeValuesSuite ) Test_GetAttributeValue () {
209294 f := s .f .GetAttributeValueKey ("example.com/attr/attr1/value/value1" )
210295
0 commit comments