You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

NativeRepositoryGroupServiceTest.java 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. package org.apache.archiva.rest.services.v2;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. import io.restassured.response.Response;
  20. import org.apache.archiva.components.rest.model.PagedResult;
  21. import org.apache.archiva.rest.api.model.v2.RepositoryGroup;
  22. import org.apache.archiva.rest.api.services.v2.ArchivaRestError;
  23. import org.junit.jupiter.api.AfterAll;
  24. import org.junit.jupiter.api.BeforeAll;
  25. import org.junit.jupiter.api.DisplayName;
  26. import org.junit.jupiter.api.MethodOrderer;
  27. import org.junit.jupiter.api.Tag;
  28. import org.junit.jupiter.api.Test;
  29. import org.junit.jupiter.api.TestInstance;
  30. import org.junit.jupiter.api.TestMethodOrder;
  31. import java.util.ArrayList;
  32. import java.util.Arrays;
  33. import java.util.HashMap;
  34. import java.util.List;
  35. import java.util.Map;
  36. import static io.restassured.RestAssured.given;
  37. import static io.restassured.http.ContentType.JSON;
  38. import static org.easymock.EasyMock.contains;
  39. import static org.hamcrest.Matchers.endsWith;
  40. import static org.junit.jupiter.api.Assertions.*;
  41. /**
  42. * @author Martin Stockhammer <martin_s@apache.org>
  43. */
  44. @TestInstance( TestInstance.Lifecycle.PER_CLASS )
  45. @Tag( "rest-native" )
  46. @TestMethodOrder( MethodOrderer.Random.class )
  47. @DisplayName( "Native REST tests for V2 RepositoryGroupService" )
  48. public class NativeRepositoryGroupServiceTest extends AbstractNativeRestServices
  49. {
  50. @Override
  51. protected String getServicePath( )
  52. {
  53. return "/repository_groups";
  54. }
  55. @BeforeAll
  56. void setup( ) throws Exception
  57. {
  58. super.setupNative( );
  59. }
  60. @AfterAll
  61. void destroy( ) throws Exception
  62. {
  63. super.shutdownNative( );
  64. }
  65. @Test
  66. void testGetEmptyList( )
  67. {
  68. String token = getAdminToken( );
  69. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  70. .when( )
  71. .get( "" )
  72. .then( ).statusCode( 200 ).extract( ).response( );
  73. assertNotNull( response );
  74. PagedResult result = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  75. assertEquals( 0, result.getPagination( ).getTotalCount( ) );
  76. }
  77. @Test
  78. void testAddGroup( )
  79. {
  80. String token = getAdminToken( );
  81. try
  82. {
  83. Map<String, Object> jsonAsMap = new HashMap<>( );
  84. jsonAsMap.put( "id", "group_001" );
  85. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  86. .when( )
  87. .body( jsonAsMap )
  88. .post( "" )
  89. .prettyPeek()
  90. .then( ).statusCode( 201 ).extract( ).response( );
  91. assertNotNull( response );
  92. RepositoryGroup result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  93. assertNotNull( result );
  94. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  95. .when( )
  96. .get( "" )
  97. .then( ).statusCode( 200 ).extract( ).response( );
  98. assertNotNull( response );
  99. PagedResult resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  100. assertEquals( 1, resultList.getPagination( ).getTotalCount( ) );
  101. } finally
  102. {
  103. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  104. .when( )
  105. .delete( "group_001" )
  106. .then( ).statusCode( 200 );
  107. }
  108. }
  109. @Test
  110. void testAddExistingGroup( )
  111. {
  112. String token = getAdminToken( );
  113. try
  114. {
  115. Map<String, Object> jsonAsMap = new HashMap<>( );
  116. jsonAsMap.put( "id", "group_001" );
  117. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  118. .when( )
  119. .body( jsonAsMap )
  120. .post( "" )
  121. .then( ).statusCode( 201 ).extract( ).response( );
  122. assertNotNull( response );
  123. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  124. .when( )
  125. .redirects().follow( false )
  126. .body( jsonAsMap )
  127. .post( "" )
  128. .prettyPeek()
  129. .then( ).statusCode( 303 )
  130. .assertThat()
  131. .header( "Location", endsWith("group_001") ).extract( ).response( );
  132. } finally
  133. {
  134. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  135. .when( )
  136. .delete( "group_001" )
  137. .then( ).statusCode( 200 );
  138. }
  139. }
  140. @Test
  141. void testAddMultipleGroups( )
  142. {
  143. String token = getAdminToken( );
  144. List<String> groups = new ArrayList<>( );
  145. try
  146. {
  147. for ( int i=0; i<10; i++)
  148. {
  149. String groupName = String.format( "group_%03d", i );
  150. groups.add( groupName );
  151. Map<String, Object> jsonAsMap = new HashMap<>( );
  152. jsonAsMap.put( "id", groupName );
  153. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  154. .when( )
  155. .body( jsonAsMap )
  156. .post( "" )
  157. .then( ).statusCode( 201 ).extract( ).response( );
  158. assertNotNull( response );
  159. RepositoryGroup result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  160. assertNotNull( result );
  161. }
  162. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  163. .when( )
  164. .get( "" )
  165. .then( ).statusCode( 200 ).extract( ).response( );
  166. assertNotNull( response );
  167. PagedResult resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  168. assertEquals( 10, resultList.getPagination( ).getTotalCount( ) );
  169. } finally
  170. {
  171. for (String groupName : groups)
  172. {
  173. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  174. .when( )
  175. .delete( groupName )
  176. .then( ).statusCode( 200 );
  177. }
  178. }
  179. }
  180. @Test
  181. void testRemoveRepositoryGroup( )
  182. {
  183. String token = getAdminToken( );
  184. List<String> groups = new ArrayList<>( );
  185. try
  186. {
  187. for ( int i=0; i<10; i++)
  188. {
  189. String groupName = String.format( "group_%03d", i );
  190. groups.add( groupName );
  191. Map<String, Object> jsonAsMap = new HashMap<>( );
  192. jsonAsMap.put( "id", groupName );
  193. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  194. .when( )
  195. .body( jsonAsMap )
  196. .post( "" )
  197. .then( ).statusCode( 201 ).extract( ).response( );
  198. assertNotNull( response );
  199. RepositoryGroup result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  200. assertNotNull( result );
  201. }
  202. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  203. .when( )
  204. .delete( "group_001" )
  205. .then( ).statusCode( 200 ).extract( ).response( );
  206. assertNotNull( response );
  207. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  208. .when( )
  209. .get( "" )
  210. .then( ).statusCode( 200 ).extract( ).response( );
  211. assertNotNull( response );
  212. PagedResult resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  213. assertEquals( 9, resultList.getPagination( ).getTotalCount( ) );
  214. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  215. .when( )
  216. .delete( "group_005" )
  217. .then( ).statusCode( 200 ).extract( ).response( );
  218. assertNotNull( response );
  219. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  220. .when( )
  221. .get( "" )
  222. .then( ).statusCode( 200 ).extract( ).response( );
  223. assertNotNull( response );
  224. resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  225. assertEquals( 8, resultList.getPagination( ).getTotalCount( ) );
  226. } finally
  227. {
  228. for (String groupName : groups)
  229. {
  230. if (!("group_001".equals(groupName) || "group_005".equals(groupName) ) )
  231. {
  232. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  233. .when( )
  234. .delete( groupName )
  235. .then( ).statusCode( 200 );
  236. }
  237. }
  238. }
  239. }
  240. @Test
  241. void testAddRepositoryToGroup( )
  242. {
  243. String token = getAdminToken( );
  244. try
  245. {
  246. Map<String, Object> jsonAsMap = new HashMap<>( );
  247. jsonAsMap.put( "id", "group_001" );
  248. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  249. .when( )
  250. .body( jsonAsMap )
  251. .post( "" )
  252. .prettyPeek()
  253. .then( ).statusCode( 201 ).extract( ).response( );
  254. assertNotNull( response );
  255. RepositoryGroup result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  256. assertNotNull( result );
  257. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  258. .when( )
  259. .get( "" )
  260. .then( ).statusCode( 200 ).extract( ).response( );
  261. assertNotNull( response );
  262. PagedResult resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  263. assertEquals( 1, resultList.getPagination( ).getTotalCount( ) );
  264. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  265. .when( )
  266. .body( jsonAsMap )
  267. .put( "group_001/repositories/internal" )
  268. .prettyPeek()
  269. .then( ).statusCode( 200 ).extract( ).response( );
  270. assertNotNull( response );
  271. result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  272. assertNotNull( result );
  273. assertEquals( 1, result.getRepositories( ).size( ) );
  274. assertTrue( result.getRepositories( ).contains( "internal" ) );
  275. } finally
  276. {
  277. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  278. .when( )
  279. .delete( "group_001" )
  280. .then( ).statusCode( 200 );
  281. }
  282. }
  283. @Test
  284. void testAddRepositoryToGroupIdempotency( )
  285. {
  286. String token = getAdminToken( );
  287. try
  288. {
  289. Map<String, Object> jsonAsMap = new HashMap<>( );
  290. jsonAsMap.put( "id", "group_001" );
  291. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  292. .when( )
  293. .body( jsonAsMap )
  294. .post( "" )
  295. .prettyPeek()
  296. .then( ).statusCode( 201 ).extract( ).response( );
  297. assertNotNull( response );
  298. RepositoryGroup result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  299. assertNotNull( result );
  300. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  301. .when( )
  302. .get( "" )
  303. .then( ).statusCode( 200 ).extract( ).response( );
  304. assertNotNull( response );
  305. PagedResult resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  306. assertEquals( 1, resultList.getPagination( ).getTotalCount( ) );
  307. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  308. .when( )
  309. .body( jsonAsMap )
  310. .put( "group_001/repositories/internal" )
  311. .prettyPeek()
  312. .then( ).statusCode( 200 ).extract( ).response( );
  313. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  314. .when( )
  315. .body( jsonAsMap )
  316. .put( "group_001/repositories/internal" )
  317. .prettyPeek()
  318. .then( ).statusCode( 200 ).extract( ).response( );
  319. assertNotNull( response );
  320. result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  321. assertNotNull( result );
  322. assertEquals( 1, result.getRepositories( ).size( ) );
  323. assertTrue( result.getRepositories( ).contains( "internal" ) );
  324. } finally
  325. {
  326. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  327. .when( )
  328. .delete( "group_001" )
  329. .then( ).statusCode( 200 );
  330. }
  331. }
  332. @Test
  333. void testRemoveRepositoryFromGroup( )
  334. {
  335. String token = getAdminToken( );
  336. try
  337. {
  338. Map<String, Object> jsonAsMap = new HashMap<>( );
  339. jsonAsMap.put( "id", "group_001" );
  340. jsonAsMap.put( "repositories", Arrays.asList( "internal" ) );
  341. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  342. .when( )
  343. .body( jsonAsMap )
  344. .post( "" )
  345. .prettyPeek()
  346. .then( ).statusCode( 201 ).extract( ).response( );
  347. assertNotNull( response );
  348. RepositoryGroup result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  349. assertNotNull( result );
  350. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  351. .when( )
  352. .get( "" )
  353. .then( ).statusCode( 200 ).extract( ).response( );
  354. assertNotNull( response );
  355. PagedResult resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  356. assertEquals( 1, resultList.getPagination( ).getTotalCount( ) );
  357. assertNotNull( result.getRepositories( ) );
  358. assertEquals( 1, result.getRepositories( ).size( ) );
  359. assertTrue( result.getRepositories( ).contains( "internal" ) );
  360. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  361. .when( )
  362. .body( jsonAsMap )
  363. .delete( "group_001/repositories/internal" )
  364. .prettyPeek()
  365. .then( ).statusCode( 200 ).extract( ).response( );
  366. assertNotNull( response );
  367. result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  368. assertNotNull( result );
  369. assertEquals( 0, result.getRepositories( ).size( ) );
  370. } finally
  371. {
  372. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  373. .when( )
  374. .delete( "group_001" )
  375. .then( ).statusCode( 200 );
  376. }
  377. }
  378. @Test
  379. void testRemoveRepositoryFromGroup404( )
  380. {
  381. String token = getAdminToken( );
  382. try
  383. {
  384. Map<String, Object> jsonAsMap = new HashMap<>( );
  385. jsonAsMap.put( "id", "group_001" );
  386. jsonAsMap.put( "repositories", Arrays.asList( "internal" ) );
  387. Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  388. .when( )
  389. .body( jsonAsMap )
  390. .post( "" )
  391. .prettyPeek()
  392. .then( ).statusCode( 201 ).extract( ).response( );
  393. assertNotNull( response );
  394. RepositoryGroup result = response.getBody( ).jsonPath( ).getObject( "", RepositoryGroup.class );
  395. assertNotNull( result );
  396. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  397. .when( )
  398. .get( "" )
  399. .then( ).statusCode( 200 ).extract( ).response( );
  400. assertNotNull( response );
  401. PagedResult resultList = response.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
  402. assertEquals( 1, resultList.getPagination( ).getTotalCount( ) );
  403. assertNotNull( result.getRepositories( ) );
  404. assertEquals( 1, result.getRepositories( ).size( ) );
  405. assertTrue( result.getRepositories( ).contains( "internal" ) );
  406. response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  407. .when( )
  408. .body( jsonAsMap )
  409. .delete( "group_001/repositories/internalxx" )
  410. .prettyPeek()
  411. .then( ).statusCode( 404 ).extract( ).response( );
  412. assertNotNull( response );
  413. ArchivaRestError error = response.getBody( ).jsonPath( ).getObject( "", ArchivaRestError.class );
  414. assertNotNull( error );
  415. } finally
  416. {
  417. given( ).spec( getRequestSpec( token ) ).contentType( JSON )
  418. .when( )
  419. .delete( "group_001" )
  420. .then( ).statusCode( 200 );
  421. }
  422. }
  423. }