@@ -479,6 +479,7 @@ class TestProjectList(TestProject):
479479 domain = identity_fakes .FakeDomain .create_one_domain ()
480480 project = identity_fakes .FakeProject .create_one_project (
481481 attrs = {'domain_id' : domain .id })
482+ projects = identity_fakes .FakeProject .create_projects ()
482483
483484 columns = (
484485 'ID' ,
@@ -490,6 +491,12 @@ class TestProjectList(TestProject):
490491 project .name ,
491492 ),
492493 )
494+ datalists = (
495+ (projects [0 ].description , True ,
496+ projects [0 ].id , projects [0 ].name ,),
497+ (projects [1 ].description , True ,
498+ projects [1 ].id , projects [1 ].name ,),
499+ )
493500
494501 def setUp (self ):
495502 super (TestProjectList , self ).setUp ()
@@ -580,6 +587,36 @@ def test_project_list_domain_no_perms(self):
580587 self .assertEqual (self .columns , columns )
581588 self .assertEqual (self .datalist , tuple (data ))
582589
590+ def test_project_list_sort (self ):
591+ self .projects_mock .list .return_value = self .projects
592+
593+ arglist = ['--sort' , 'name:asc' , ]
594+ verifylist = []
595+
596+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
597+
598+ # In base command class Lister in cliff, abstract method take_action()
599+ # returns a tuple containing the column names and an iterable
600+ # containing the data to be listed.
601+ (columns , data ) = self .cmd .take_action (parsed_args )
602+ self .projects_mock .list .assert_called_with ()
603+
604+ collist = ('ID' , 'Name' )
605+ self .assertEqual (collist , columns )
606+
607+ if self .projects [0 ].name > self .projects [1 ].name :
608+ datalists = (
609+ (self .projects [1 ].id , self .projects [1 ].name ),
610+ (self .projects [0 ].id , self .projects [0 ].name ),
611+ )
612+ else :
613+ datalists = (
614+ (self .projects [0 ].id , self .projects [0 ].name ),
615+ (self .projects [1 ].id , self .projects [1 ].name ),
616+ )
617+
618+ self .assertEqual (datalists , tuple (data ))
619+
583620
584621class TestProjectSet (TestProject ):
585622
0 commit comments