a7df421b500b1e16b8a2a588686a9956481c31de
[aaf/authz.git] / auth / auth-service / src / test / java / org / onap / aaf / authz / service / mapper / JU_Mapper_2_0.java
1 /*******************************************************************************
2  * ============LICENSE_START====================================================
3  * * org.onap.aaf
4  * * ===========================================================================
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * * ===========================================================================
7  * * Licensed under the Apache License, Version 2.0 (the "License");
8  * * you may not use this file except in compliance with the License.
9  * * You may obtain a copy of the License at
10  * * 
11  *  *      http://www.apache.org/licenses/LICENSE-2.0
12  * * 
13  *  * Unless required by applicable law or agreed to in writing, software
14  * * distributed under the License is distributed on an "AS IS" BASIS,
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * * See the License for the specific language governing permissions and
17  * * limitations under the License.
18  * * ============LICENSE_END====================================================
19  * *
20  * *
21  ******************************************************************************/
22 package org.onap.aaf.authz.service.mapper;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertFalse;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertNull;
28 import static org.junit.Assert.assertTrue;
29 import static org.junit.Assert.fail;
30 import static org.mockito.BDDMockito.given;
31 import static org.mockito.Matchers.any;
32 import static org.mockito.Matchers.anyString;
33 import static org.mockito.Matchers.eq;
34 import static org.mockito.Mockito.mock;
35 import static org.mockito.Mockito.spy;
36 import static org.mockito.Mockito.verify;
37 import static org.mockito.Mockito.verifyZeroInteractions;
38 import static org.onap.aaf.auth.layer.Result.ERR_BadData;
39 import static org.onap.aaf.auth.layer.Result.ERR_General;
40
41 import aaf.v2_0.NsRequest;
42 import aaf.v2_0.Nss;
43 import aaf.v2_0.Nss.Ns;
44 import aaf.v2_0.Perm;
45 import aaf.v2_0.PermKey;
46 import aaf.v2_0.PermRequest;
47 import aaf.v2_0.Perms;
48 import aaf.v2_0.Pkey;
49 import aaf.v2_0.Request;
50 import aaf.v2_0.Role;
51 import aaf.v2_0.RoleRequest;
52 import aaf.v2_0.Roles;
53 import aaf.v2_0.UserRole;
54 import aaf.v2_0.UserRoleRequest;
55 import aaf.v2_0.UserRoles;
56 import com.google.common.collect.ImmutableMap;
57 import com.google.common.collect.Iterables;
58 import com.google.common.collect.Lists;
59 import com.google.common.collect.Sets;
60 import java.io.IOException;
61 import java.text.SimpleDateFormat;
62 import java.util.Calendar;
63 import java.util.Collection;
64 import java.util.Date;
65 import java.util.GregorianCalendar;
66 import java.util.List;
67 import java.util.Map;
68 import java.util.Set;
69 import java.util.stream.Collectors;
70 import org.junit.Assert;
71 import org.junit.Before;
72 import org.junit.Test;
73 import org.junit.runner.RunWith;
74 import org.mockito.Mock;
75 import org.mockito.runners.MockitoJUnitRunner;
76 import org.onap.aaf.auth.dao.cass.Namespace;
77 import org.onap.aaf.auth.dao.cass.NsDAO;
78 import org.onap.aaf.auth.dao.cass.NsSplit;
79 import org.onap.aaf.auth.dao.cass.NsType;
80 import org.onap.aaf.auth.dao.cass.PermDAO;
81 import org.onap.aaf.auth.dao.cass.PermDAO.Data;
82 import org.onap.aaf.auth.dao.cass.RoleDAO;
83 import org.onap.aaf.auth.dao.cass.UserRoleDAO;
84 import org.onap.aaf.auth.dao.hl.Question;
85 import org.onap.aaf.auth.dao.hl.Question.Access;
86 import org.onap.aaf.auth.env.AuthzTrans;
87 import org.onap.aaf.auth.env.AuthzTrans.REQD_TYPE;
88 import org.onap.aaf.auth.layer.Result;
89 import org.onap.aaf.auth.org.Organization;
90 import org.onap.aaf.auth.org.Organization.Expiration;
91 import org.onap.aaf.auth.rserv.Pair;
92 import org.onap.aaf.auth.service.mapper.Mapper.API;
93 import org.onap.aaf.auth.service.mapper.Mapper_2_0;
94 import org.onap.aaf.cadi.CadiException;
95 import org.onap.aaf.misc.env.APIException;
96 import org.onap.aaf.misc.env.Env;
97 import org.onap.aaf.misc.env.TimeTaken;
98 import org.onap.aaf.org.DefaultOrg;
99
100 @RunWith(MockitoJUnitRunner.class)
101 public class JU_Mapper_2_0 {
102
103   private static final String USER = "John";
104
105         private Mapper_2_0 mapper;
106         @Mock
107         private Question question;
108         @Mock
109         private AuthzTrans transaction;
110         @Mock
111   private TimeTaken tt;
112
113
114         @Before
115         public void setUp() throws APIException, IOException, CadiException {
116           given(transaction.start(anyString(), eq(Env.SUB))).willReturn(tt);
117           given(transaction.user()).willReturn(USER);
118                 this.mapper = new Mapper_2_0(question);
119         }
120
121         @Test(expected = ClassCastException.class)
122         public void ns_willThrowException_whenInvalidRequestType() {
123                 //given
124                 Request rq = new Request();
125
126                 //when
127                 mapper.ns(transaction, rq);
128
129                 //then
130                 fail("Expected ClassCastException");
131         }
132
133         @Test
134         public void ns_shouldConvertNamespaceRequest_whenValidTypeIsExplicitlyProvided() {
135                 //given
136                 String namespaceName = "org.companyA.app1";
137                 String namespaceType = "APP";
138                 NsType expectedNsType = NsType.APP;
139                 NsRequest nsRequest = createNsRequestForType(namespaceName, namespaceType);
140
141                 //when
142                 Result<Namespace> result = mapper.ns(transaction,nsRequest);
143
144                 //then
145                 assertTrue(result.isOK());
146                 assertNamespaceValues(result.value, expectedNsType, namespaceName);
147                 verify(transaction).checkpoint(namespaceName,Env.ALWAYS);
148         }
149
150         @Test
151         public void ns_shouldConvertNamespaceRequest_whenInValidTypeIsExplicitlyProvided() {
152                 //given
153                 String namespaceName = "org.companyA.app1.service0";
154                 String invalidNsType = "BLUE";
155                 NsType expectedNsType = NsType.APP;
156                 NsRequest nsRequest = createNsRequestForType(namespaceName, invalidNsType);
157
158                 //when
159                 Result<Namespace> result = mapper.ns(transaction,nsRequest);
160
161                 //then
162                 assertTrue(result.isOK());
163                 assertNamespaceValues(result.value, expectedNsType, namespaceName);
164                 verify(transaction).checkpoint(namespaceName,Env.ALWAYS);
165         }
166
167         @Test
168         public void ns_shouldConvertRootNamespaceRequest_whenTypeNotProvided() {
169                 //given
170                 String rootNsName = "org";
171                 NsType expectedNsType = NsType.ROOT;
172                 NsRequest nsRequest = createNsRequestForType(rootNsName, null);
173
174                 //when
175                 Result<Namespace> result = mapper.ns(transaction,nsRequest);
176
177                 //then
178                 assertTrue(result.isOK());
179                 assertNamespaceValues(result.value, expectedNsType, rootNsName);
180                 verify(transaction).checkpoint(rootNsName,Env.ALWAYS);
181         }
182
183         @Test
184         public void ns_shouldConvertCompanyNamespaceRequest_whenTypeNotProvided() {
185                 //given
186                 String companyNsName = "org.companyA";
187                 NsType expectedNsType = NsType.COMPANY;
188                 NsRequest nsRequest = createNsRequestForType(companyNsName, null);
189
190                 //when
191                 Result<Namespace> result = mapper.ns(transaction,nsRequest);
192
193                 //then
194                 assertTrue(result.isOK());
195                 assertNamespaceValues(result.value, expectedNsType, companyNsName);
196                 verify(transaction).checkpoint(companyNsName,Env.ALWAYS);
197         }
198
199         private void assertNamespaceValues(Namespace value, NsType nsType, String namespaceName) {
200                 List<String> people = Lists.newArrayList("tk007@people.osaaf.org");
201                 assertEquals(Integer.valueOf(nsType.type), value.type);
202                 assertEquals(namespaceName, value.name);
203                 assertEquals("some namespace description", value.description);
204                 assertEquals(people, value.admin);
205                 assertEquals(people, value.owner);
206         }
207
208         private NsRequest createNsRequestForType(String nsName, String nsType) {
209                 NsRequest req = mapper.newInstance(API.NS_REQ);
210                 req.setType(nsType);
211                 req.setName(nsName);
212                 req.setDescription("some namespace description");
213                 req.getAdmin().add("tk007@people.osaaf.org");
214                 req.getResponsible().add("tk007@people.osaaf.org");
215                 return req;
216         }
217
218         @Test
219         public void nss_shouldConvertNamespaceToNss_withoutAttributes() {
220                 //given
221                 Nss nss = mapper.newInstance(API.NSS);
222                 Namespace ns = mapper.ns(transaction, createNsRequestForType("org.onap",  null)).value;
223
224                 //when
225                 Result<Nss> result = mapper.nss(transaction, ns, nss);
226
227                 //then
228                 assertTrue(result.isOK());
229                 assertEquals("Only one Ns should be added",1, result.value.getNs().size());
230                 Ns addedNs = Iterables.getOnlyElement(result.value.getNs());
231                 assertEquals(ns.admin, addedNs.getAdmin());
232                 assertEquals(ns.name, addedNs.getName());
233                 assertEquals(ns.owner, addedNs.getResponsible());
234                 assertEquals(ns.description, addedNs.getDescription());
235                 assertTrue(addedNs.getAttrib().isEmpty());
236         }
237
238         @Test
239         public void nss_shouldConvertNamespaceToNss_withAttributes() {
240                 //given
241                 Nss nss = mapper.newInstance(API.NSS);
242                 Namespace ns = mapper.ns(transaction, createNsRequestForType("org.onap",  null)).value;
243                 ns.attrib = Lists.newArrayList();
244                 int attribNum = 5;
245                 Map<String, String> attribs = ImmutableMap.of("key1", "value1", "key2", "value2", "key3", "value3", "key4", "value4", "key5", "value5");
246                 attribs.forEach((key,val) -> ns.attrib.add(new Pair<>(key,val)));
247
248                 //when
249                 Result<Nss> result = mapper.nss(transaction, ns, nss);
250
251                 //then
252                 assertTrue(result.isOK());
253                 assertEquals("Only one Ns should be added",1, result.value.getNs().size());
254                 Ns addedNs = Iterables.getOnlyElement(result.value.getNs());
255                 assertEquals(attribNum, addedNs.getAttrib().size());
256                 addedNs.getAttrib().forEach( attr -> {
257                         assertEquals(attr.getValue(), attribs.get(attr.getKey()));
258                 });
259         }
260
261         @Test
262         public void nss_shouldAddSeveralNamespacesToNss() {
263                 //given
264                 Nss nss = mapper.newInstance(API.NSS);
265                 Namespace ns1 = mapper.ns(transaction, createNsRequestForType("org.onap",  "COMPANY")).value;
266                 Namespace ns2 = mapper.ns(transaction, createNsRequestForType("org.onap.prh",  "APP")).value;
267
268                 //when
269                 Result<Nss> result = mapper.nss(transaction, Lists.newArrayList(ns1,ns2), nss);
270
271                 //then
272                 assertTrue(result.isOK());
273                 assertEquals("Two namespaces should be added",2, result.value.getNs().size());
274         }
275
276         @Test
277         public void perm_shouldNotAddPerms_whenFilterIsSet_andUserIsNotAuthorized() {
278                 //given
279     given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
280         .willReturn(Result.err(9, "error"));
281     Perms permsContainer = mapper.newInstance(API.PERMS);
282     List<PermDAO.Data> permsData = Lists.newArrayList(new PermDAO.Data());
283     boolean filter = true;
284
285                 //when
286     Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, filter);
287
288                 //then
289     assertTrue(result.isOK());
290     assertEquals("No perms added",0,result.value.getPerm().size());
291         }
292
293         @Test
294   public void perm_shouldAddPerm_withNamespaceSet_whenUserIsAuthorized_AndNamespaceIsRequestedType() {
295       //given
296       given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
297           .willReturn(Result.ok(new NsDAO.Data()));
298       given(transaction.requested(REQD_TYPE.ns)).willReturn(true);
299       Perms permsContainer = mapper.newInstance(API.PERMS);
300       Set<String> roles = Sets.newHashSet("org.onap.portal.owner","org.onap.portal.designer"
301                                 ,"org.onap.portal.tester");
302       String namespace = "org.onap.portal";
303       String type = "access";
304       String fullType = namespace + "." +type;
305       String action = "read";
306       String description = "Portal Read Access";
307                   List<PermDAO.Data> permsData = Lists.newArrayList(createPermDAOobj(namespace, type, "*",action, roles, description));
308       boolean filter = true;
309
310       //when
311       Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, filter);
312
313       //then
314       assertTrue(result.isOK());
315       assertEquals("Perm is added",1,result.value.getPerm().size());
316       Perm perm = Iterables.getOnlyElement(result.value.getPerm());
317       assertEquals(namespace, perm.getNs());
318       assertEquals(fullType, perm.getType());
319       assertEquals(action, perm.getAction());
320       assertEquals("*", perm.getInstance());
321       assertEquals(description, perm.getDescription());
322       assertEquals(Lists.newArrayList(roles), perm.getRoles());
323   }
324
325         @Test
326         public void perm_shouldAddPerm_withoutNamespaceSet_whenUserIsAuthorized_AndNamespaceIsNotRequestedType() {
327                 //given
328                 given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
329                         .willReturn(Result.ok(new NsDAO.Data()));
330                 given(transaction.requested(REQD_TYPE.ns)).willReturn(false);
331                 Perms permsContainer = mapper.newInstance(API.PERMS);
332                 String namespace = "org.onap.portal";
333                 String type = "access";
334                 String fullType = namespace + "." + type;
335                 String action = "read";
336                 List<PermDAO.Data> permsData = Lists.newArrayList(createPermDAOobj(namespace, type, "*",action, null, null));
337                 boolean filter = true;
338
339                 //when
340                 Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, filter);
341
342                 //then
343                 assertTrue(result.isOK());
344                 assertEquals("Perm is added",1,result.value.getPerm().size());
345                 Perm perm = Iterables.getOnlyElement(result.value.getPerm());
346                 assertNull(perm.getNs());
347                 assertEquals(fullType, perm.getType());
348                 assertEquals(action, perm.getAction());
349         }
350
351         @Test
352         public void perm_shouldAddPermsWithCorrectSortedOrder() {
353                 //given
354                 given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
355                         .willReturn(Result.ok(new NsDAO.Data()));
356                 Perms permsContainer = mapper.newInstance(API.PERMS);
357                 PermDAO.Data perm1 = createPermDAOobj("org.onap.portal", "access", "*", "read", null, null);
358                 PermDAO.Data perm2 = createPermDAOobj("org.onap.portal", "access", "*", "write", null, null);
359                 PermDAO.Data perm3 = createPermDAOobj("org.onap.portal", "design", "*", "new", null, null);
360                 PermDAO.Data perm4 = createPermDAOobj("org.onap.portal", "workflow", "1", "edit", null, null);
361                 PermDAO.Data perm5 = createPermDAOobj("org.onap.portal", "workflow", "2", "edit", null, null);
362                 List<PermDAO.Data> permsData = Lists.newArrayList(perm4, perm1, perm5, perm3, perm2);
363                 List<PermDAO.Data> correctOrderPerms = Lists.newArrayList(perm1, perm2, perm3, perm4, perm5);
364
365                 //when
366                 Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, true);
367
368                 //then
369                 assertTrue(result.isOK());
370                 assertEquals("Alls Perms added",5,result.value.getPerm().size());
371                 List<Perm> mappedPerms = result.value.getPerm();
372                 for(int i=0; i<5; i++) {
373                         comparePerm(correctOrderPerms.get(i), mappedPerms.get(i));
374                 }
375         }
376
377         private void comparePerm(Data data, Perm perm) {
378                 assertEquals(data.ns + "." + data.type, perm.getType());
379                 assertEquals(data.instance, perm.getInstance());
380                 assertEquals(data.action, perm.getAction());
381         }
382
383         private PermDAO.Data createPermDAOobj(String ns, String name, String instance, String action, Set<String> roles, String description) {
384                         NsSplit nss = new NsSplit(ns, name);
385       PermDAO.Data perm = new PermDAO.Data(nss, instance, action);
386       perm.roles = roles;
387       perm.description = description;
388       return perm;
389   }
390
391   @Test
392         public void role_shouldReturnErrorResult_whenNssIsNok() throws Exception {
393                 //given
394                 String roleName = "admin";
395                 RoleRequest request = createRoleRequest(roleName, "role description");
396                 given(question.deriveNsSplit(transaction, roleName)).willReturn(Result.err(new IllegalArgumentException()));
397
398                 //when
399                 Result<RoleDAO.Data> result = mapper.role(transaction, request);
400
401                 //then
402                 assertFalse(result.isOK());
403                 assertNull(result.value);
404                 assertEquals(ERR_General, result.status);
405         }
406
407         @Test
408         public void role_shouldReturnMappedRoleObject_whenNssIsOk() throws Exception {
409                 //given
410                 String roleName = "admin";
411                 String roleNs = "org.onap.roles";
412                 String roleFullName = roleNs + "." + roleName;
413                 String description =" role description";
414                 RoleRequest request = createRoleRequest(roleFullName, description);
415                 given(question.deriveNsSplit(transaction, roleFullName)).willReturn(Result.ok(new NsSplit(roleNs, roleName)));
416
417                 //when
418                 Result<RoleDAO.Data> result = mapper.role(transaction, request);
419
420                 //then
421                 assertTrue(result.isOK());
422                 assertEquals(roleName, result.value.name);
423                 assertEquals(roleNs, result.value.ns);
424                 assertEquals(description, result.value.description);
425                 verify(transaction).checkpoint(roleFullName, Env.ALWAYS);
426         }
427
428         private RoleRequest createRoleRequest(String name, String description) {
429                 RoleRequest req = mapper.newInstance(API.ROLE_REQ);
430                 req.setName(name);
431                 req.setDescription(description);
432                 return req;
433         }
434
435         @Test
436         public void roles_shouldNotAddAnyRoles_whenFilterFlagIsNotSet() {
437                 //given
438                 Roles initialRoles = new Roles();
439                 RoleDAO.Data role = createRoleDAOobj("org.onap.app1", "org.onap.app1.admin", "description");
440
441                 //when
442                 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), initialRoles, false);
443
444                 //then
445                 assertTrue(result.isOK());
446                 assertEquals(initialRoles.getRole(), result.value.getRole());
447         }
448
449         @Test
450         public void roles_shouldNotAddAnyRoles_whenFilterFlagIsSet_andUserIsNotAuthorizedToReadRole() {
451                 //given
452                 Roles initialRoles = new Roles();
453                 RoleDAO.Data role = createRoleDAOobj("org.onap.app1", "org.onap.app1.admin", "description");
454                 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
455                         .willReturn(Result.err(9, "error"));
456
457                 //when
458                 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), initialRoles, true);
459
460                 //then
461                 assertTrue(result.isOK());
462                 assertEquals(initialRoles.getRole(), result.value.getRole());
463         }
464
465         @Test
466         public void roles_shouldAddRolesWithoutNamespace_whenNsNotRequested_andFilterFlagSet_andUserIsAuthorized() {
467                 test_roles_shouldAddRoles(false);
468         }
469
470         @Test
471         public void roles_shouldAddRolesWithNamespace_whenNsRequested_andFilterFlagSet_andUserIsAuthorized() {
472                 test_roles_shouldAddRoles(true);
473         }
474
475         private void test_roles_shouldAddRoles(boolean namespaceRequested) {
476                 //given
477                 String namespace = "org.onap.app1";
478                 String description = "role description";
479                 Set<String> roleNames = Sets.newHashSet(namespace+".admin", namespace+".deployer");
480                 List<RoleDAO.Data> daoRoles = roleNames.stream().map( name -> createRoleDAOobj(namespace, name, description))
481                         .collect(Collectors.toList());
482                 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
483                         .willReturn(Result.ok(new NsDAO.Data()));
484                 given(transaction.requested(REQD_TYPE.ns)).willReturn(namespaceRequested);
485
486                 //when
487                 Result<Roles> result = mapper.roles(transaction, daoRoles, new Roles(), true);
488
489                 //then
490                 assertTrue(result.isOK());
491                 assertEquals(2, result.value.getRole().size());
492                 result.value.getRole().stream().forEach( role -> {
493                         assertTrue(role.getPerms().isEmpty());
494                         if(namespaceRequested) {
495                                 assertEquals(namespace, role.getNs());
496                         } else {
497                                 assertNull(role.getNs());
498                         }
499                         assertTrue(roleNames.contains(role.getName()));
500                         assertEquals(description, role.getDescription());
501                 });
502         }
503
504         @Test
505         public void roles_shouldReturnErrorResult_whenAnyPermHasInvalidFormat() {
506                 //given
507                 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
508                         .willReturn(Result.ok(new NsDAO.Data()));
509                 RoleDAO.Data role = createRoleDAOobj("org.onap.app", "org.onap.app.admin", "description");
510                 role.perms = Sets.newHashSet("invalidPermFormat");
511
512                 //when
513                 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), new Roles(), true);
514
515                 //then
516                 assertFalse(result.isOK());
517                 assertEquals(ERR_BadData, result.status);
518         }
519
520         @Test
521         public void roles_shouldAddPerms_whenAllPermsProperlyDefined_andUserCanViewIt() {
522                 //given
523                 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
524                         .willReturn(Result.ok(new NsDAO.Data()));
525                 given(question.deriveNsSplit(transaction, "org.onap.app")).willReturn(Result.ok(mock(NsSplit.class)));
526                 RoleDAO.Data role = createRoleDAOobj("org.onap.app", "org.onap.app.admin", "description");
527                 role.perms = Sets.newHashSet("org.onap.app|access|*|read,approve");
528
529                 //when
530                 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), new Roles(), true);
531
532                 //then
533                 assertTrue(result.isOK());
534                 Role mappedRole = Iterables.getOnlyElement(result.value.getRole());
535                 Pkey pKey =  Iterables.getOnlyElement(mappedRole.getPerms());
536                 assertEquals("org.onap.app.access", pKey.getType());
537                 assertEquals("*", pKey.getInstance());
538                 assertEquals("read,approve", pKey.getAction());
539         }
540
541         private RoleDAO.Data createRoleDAOobj(String namespace, String rolename, String desc) {
542                 NsDAO.Data ns = new NsDAO.Data();
543                 ns.name = namespace;
544                 RoleDAO.Data role = RoleDAO.Data.create(ns, rolename);
545                 role.description = desc;
546                 return role;
547         }
548
549         @Test
550         public void userRoles_shouldMapUserRolesFromDAO() {
551                 //given
552                 String user = "john@people.osaaf.org";
553                 String role = "admin";
554                 String namespace = "org.osaaf.aaf";
555                 int year = 2020;
556                 int month = 10;
557                 int day = 31;
558                 Date expiration = new Calendar.Builder().setDate(year,month-1, day).build().getTime(); //month is 0-based
559                 UserRoles targetRoles = new UserRoles();
560
561                 //when
562                 Result<UserRoles> result = mapper.userRoles(transaction, Lists.newArrayList(
563                         createUserRoleDAOobj(user, expiration, namespace, role)), targetRoles);
564
565                 //then
566                 assertTrue(result.isOK());
567                 UserRole targetRole = Iterables.getOnlyElement(result.value.getUserRole());
568                 assertEquals(user, targetRole.getUser());
569                 assertEquals(role, targetRole.getRole());
570                 assertEquals(year, targetRole.getExpires().getYear());
571                 assertEquals(month, targetRole.getExpires().getMonth());
572                 assertEquals(day, targetRole.getExpires().getDay());
573         }
574
575         @Test
576         public void userRole_shouldReturnErrorResult_whenAnyExceptionOccurs() {
577                 //given
578                 PermRequest wrongRequestType = new PermRequest();
579
580                 //when
581                 Result<UserRoleDAO.Data> result = mapper.userRole(transaction, wrongRequestType);
582
583                 //then
584                 assertFalse(result.isOK());
585                 assertEquals(ERR_BadData, result.status);
586                 verifyZeroInteractions(transaction);
587         }
588
589         @Test
590         public void userRole_shouldReturnEmptyRoleDAOobj_whenRequestIsEmpty() {
591                 //given
592                 UserRoleRequest request = new UserRoleRequest();
593                 given(question.deriveNsSplit(any(), any())).willReturn(Result.err(new IllegalArgumentException()));
594                 Organization org = mock(Organization.class);
595                 given(org.expiration(any(), eq(Expiration.UserInRole), any())).willReturn(new GregorianCalendar());
596                 given(transaction.org()).willReturn(org);
597
598                 //when
599                 Result<UserRoleDAO.Data> result = mapper.userRole(transaction, request);
600
601                 //then
602                 assertTrue(result.isOK());
603                 assertNull(result.value.ns);
604                 assertNull(result.value.rname);
605                 assertNull(result.value.role);
606                 assertNull(result.value.user);
607                 assertNotNull(result.value.expires);
608         }
609
610         @Test
611         public void userRole_shouldReturnMappedRoleDAOobj_whenRequestIsFilled() {
612                 //given
613                 String user = "johny@people.osaaf.org";
614                 String role = "org.onap.app1.deployer";
615                 String rName = "deployer";
616                 String namespace = "org.onap.app1";
617
618                 given(question.deriveNsSplit(transaction, role)).willReturn(Result.ok(new NsSplit(namespace, rName)));
619                 Organization org = mock(Organization.class);
620                 given(org.expiration(any(), eq(Expiration.UserInRole), any())).willReturn(new GregorianCalendar());
621                 given(transaction.org()).willReturn(org);
622
623                 //when
624                 Result<UserRoleDAO.Data> result = mapper.userRole(transaction, createUserRoleRequest(role, user));
625
626                 //then
627                 assertTrue(result.isOK());
628                 assertEquals(user, result.value.user);
629                 assertEquals(role, result.value.role);
630                 assertEquals(rName, result.value.rname);
631                 assertEquals(namespace, result.value.ns);
632                 assertNotNull(result.value.expires);
633         }
634
635         private UserRoleRequest createUserRoleRequest(String role, String user) {
636                 UserRoleRequest request = new UserRoleRequest();
637                 request.setRole(role);
638                 request.setUser(user);
639                 return request;
640         }
641
642         private UserRoleDAO.Data createUserRoleDAOobj(String userName, Date expires, String namespace, String roleName) {
643                 UserRoleDAO.Data userRole =  new UserRoleDAO.Data();
644                 userRole.user = userName;
645                 userRole.expires = expires;
646                 userRole.ns = namespace;
647                 userRole.role = roleName;
648                 return userRole;
649         }
650
651 }