Skip to content

Commit e1f74cc

Browse files
wimskiWimWidgets
andauthored
[11.9] Add support for user starred projects (#735)
Co-authored-by: Wim Reckman <[email protected]>
1 parent 35000ed commit e1f74cc

File tree

2 files changed

+173
-0
lines changed

2 files changed

+173
-0
lines changed

src/Api/Users.php

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,88 @@ public function usersProjects(int $id, array $parameters = [])
174174
return $this->get('users/'.self::encodePath($id).'/projects', $resolver->resolve($parameters));
175175
}
176176

177+
/**
178+
* @param int $id
179+
* @param array $parameters {
180+
*
181+
* @var bool $archived limit by archived status
182+
* @var string $visibility limit by visibility public, internal, or private
183+
* @var string $order_by Return projects ordered by id, name, path, created_at, updated_at,
184+
* or last_activity_at fields (default is created_at)
185+
* @var string $sort Return projects sorted in asc or desc order (default is desc)
186+
* @var string $search return list of projects matching the search criteria
187+
* @var bool $simple return only the ID, URL, name, and path of each project
188+
* @var bool $owned limit by projects owned by the current user
189+
* @var bool $membership limit by projects that the current user is a member of
190+
* @var bool $starred limit by projects starred by the current user
191+
* @var bool $statistics include project statistics
192+
* @var bool $with_issues_enabled limit by enabled issues feature
193+
* @var bool $with_merge_requests_enabled limit by enabled merge requests feature
194+
* @var int $min_access_level Limit by current user minimal access level
195+
* @var bool $with_custom_attributes Include custom attributes in response (administrator only)
196+
* }
197+
*
198+
* @return mixed
199+
*/
200+
public function usersStarredProjects(int $id, array $parameters = [])
201+
{
202+
$resolver = $this->createOptionsResolver();
203+
$booleanNormalizer = function (Options $resolver, $value): string {
204+
return $value ? 'true' : 'false';
205+
};
206+
$resolver->setDefined('archived')
207+
->setAllowedTypes('archived', 'bool')
208+
->setNormalizer('archived', $booleanNormalizer)
209+
;
210+
$resolver->setDefined('visibility')
211+
->setAllowedValues('visibility', ['public', 'internal', 'private'])
212+
;
213+
$resolver->setDefined('order_by')
214+
->setAllowedValues('order_by', ['id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at'])
215+
;
216+
$resolver->setDefined('sort')
217+
->setAllowedValues('sort', ['asc', 'desc'])
218+
;
219+
$resolver->setDefined('search');
220+
$resolver->setDefined('simple')
221+
->setAllowedTypes('simple', 'bool')
222+
->setNormalizer('simple', $booleanNormalizer)
223+
;
224+
$resolver->setDefined('owned')
225+
->setAllowedTypes('owned', 'bool')
226+
->setNormalizer('owned', $booleanNormalizer)
227+
;
228+
$resolver->setDefined('membership')
229+
->setAllowedTypes('membership', 'bool')
230+
->setNormalizer('membership', $booleanNormalizer)
231+
;
232+
$resolver->setDefined('starred')
233+
->setAllowedTypes('starred', 'bool')
234+
->setNormalizer('starred', $booleanNormalizer)
235+
;
236+
$resolver->setDefined('statistics')
237+
->setAllowedTypes('statistics', 'bool')
238+
->setNormalizer('statistics', $booleanNormalizer)
239+
;
240+
$resolver->setDefined('with_issues_enabled')
241+
->setAllowedTypes('with_issues_enabled', 'bool')
242+
->setNormalizer('with_issues_enabled', $booleanNormalizer)
243+
;
244+
$resolver->setDefined('with_merge_requests_enabled')
245+
->setAllowedTypes('with_merge_requests_enabled', 'bool')
246+
->setNormalizer('with_merge_requests_enabled', $booleanNormalizer)
247+
;
248+
$resolver->setDefined('min_access_level')
249+
->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50])
250+
;
251+
$resolver->setDefined('with_custom_attributes')
252+
->setAllowedTypes('with_custom_attributes', 'bool')
253+
->setNormalizer('with_custom_attributes', $booleanNormalizer)
254+
;
255+
256+
return $this->get('users/'.self::encodePath($id).'/starred_projects', $resolver->resolve($parameters));
257+
}
258+
177259
/**
178260
* @return mixed
179261
*/

tests/Api/UsersTest.php

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,97 @@ public function shouldSearchUsersProjects(): void
294294
$this->assertEquals($expectedArray, $api->usersProjects(1, ['search' => 'a project']));
295295
}
296296

297+
/**
298+
* @test
299+
*/
300+
public function shouldShowUsersStarredProjects(): void
301+
{
302+
$expectedArray = $this->getUsersProjectsData();
303+
304+
$api = $this->getUsersProjectsRequestMock('users/1/starred_projects', $expectedArray);
305+
306+
$this->assertEquals($expectedArray, $api->usersStarredProjects(1));
307+
}
308+
309+
/**
310+
* @test
311+
*/
312+
public function shouldShowUsersStarredProjectsWithLimit(): void
313+
{
314+
$expectedArray = [$this->getUsersProjectsData()[0]];
315+
316+
$api = $this->getUsersProjectsRequestMock('users/1/starred_projects', $expectedArray, ['per_page' => 1]);
317+
318+
$this->assertEquals($expectedArray, $api->usersStarredProjects(1, ['per_page' => 1]));
319+
}
320+
321+
/**
322+
* @test
323+
*/
324+
public function shouldGetAllUsersStarredProjectsSortedByName(): void
325+
{
326+
$expectedArray = $this->getUsersProjectsData();
327+
328+
$api = $this->getUsersProjectsRequestMock(
329+
'users/1/starred_projects',
330+
$expectedArray,
331+
['page' => 1, 'per_page' => 5, 'order_by' => 'name', 'sort' => 'asc']
332+
);
333+
334+
$this->assertEquals(
335+
$expectedArray,
336+
$api->usersStarredProjects(1, ['page' => 1, 'per_page' => 5, 'order_by' => 'name', 'sort' => 'asc'])
337+
);
338+
}
339+
340+
/**
341+
* @test
342+
*/
343+
public function shouldGetNotArchivedUsersStarredProjects(): void
344+
{
345+
$expectedArray = $this->getUsersProjectsData();
346+
347+
$api = $this->getUsersProjectsRequestMock('users/1/starred_projects', $expectedArray, ['archived' => 'false']);
348+
349+
$this->assertEquals($expectedArray, $api->usersStarredProjects(1, ['archived' => false]));
350+
}
351+
352+
/**
353+
* @test
354+
*/
355+
public function shouldGetOwnedUsersStarredProjects(): void
356+
{
357+
$expectedArray = $this->getUsersProjectsData();
358+
359+
$api = $this->getUsersProjectsRequestMock('users/1/starred_projects', $expectedArray, ['owned' => 'true']);
360+
361+
$this->assertEquals($expectedArray, $api->usersStarredProjects(1, ['owned' => true]));
362+
}
363+
364+
/**
365+
* @test
366+
* @dataProvider possibleAccessLevels
367+
*/
368+
public function shouldGetStarredProjectsWithMinimumAccessLevel($level): void
369+
{
370+
$expectedArray = $this->getUsersProjectsData();
371+
372+
$api = $this->getUsersProjectsRequestMock('users/1/starred_projects', $expectedArray, ['min_access_level' => $level]);
373+
374+
$this->assertEquals($expectedArray, $api->usersStarredProjects(1, ['min_access_level' => $level]));
375+
}
376+
377+
/**
378+
* @test
379+
*/
380+
public function shouldSearchUsersStarredProjects(): void
381+
{
382+
$expectedArray = $this->getUsersProjectsData();
383+
384+
$api = $this->getUsersProjectsRequestMock('users/1/starred_projects', $expectedArray, ['search' => 'a project']);
385+
$this->assertEquals($expectedArray, $api->usersStarredProjects(1, ['search' => 'a project']));
386+
}
387+
297388
/**
298389
* @test
299390
*/

0 commit comments

Comments
 (0)