/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.frontend.web.controllers;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.orcid.core.manager.EmailManager;
import org.orcid.core.manager.EncryptionManager;
import org.orcid.core.manager.NotificationManager;
import org.orcid.core.manager.ProfileEntityCacheManager;
import org.orcid.core.manager.ProfileEntityManager;
import org.orcid.jaxb.model.common_v2.Locale;
import org.orcid.jaxb.model.common_v2.Visibility;
import org.orcid.persistence.jpa.entities.EmailEntity;
import org.orcid.persistence.jpa.entities.ProfileEntity;
import org.orcid.pojo.EmailRequest;
import org.orcid.pojo.ajaxForm.Checkbox;
import org.orcid.pojo.ajaxForm.Claim;
import org.orcid.pojo.ajaxForm.Text;
import org.orcid.test.OrcidJUnit4ClassRunner;
import org.orcid.test.TargetProxyHelper;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
@RunWith(OrcidJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:orcid-frontend-web-servlet.xml", "classpath:orcid-core-context.xml", "classpath:statistics-core-context.xml" })
public class ClaimControllerTest {
@Resource
private ClaimController claimController;
@Mock
private ProfileEntityManager profileEntityManager;
@Mock
private EncryptionManager encryptionManager;
@Mock
private ProfileEntityCacheManager profileEntityCacheManager;
@Mock
private EmailManager emailManager;
@Mock
private NotificationManager notificationManager;
@Before
public void before() {
MockitoAnnotations.initMocks(this);
TargetProxyHelper.injectIntoProxy(claimController, "encryptionManager", encryptionManager);
TargetProxyHelper.injectIntoProxy(claimController, "emailManager", emailManager);
TargetProxyHelper.injectIntoProxy(claimController, "profileEntityManager", profileEntityManager);
TargetProxyHelper.injectIntoProxy(claimController, "profileEntityCacheManager", profileEntityCacheManager);
TargetProxyHelper.injectIntoProxy(claimController, "notificationManager", notificationManager);
}
@Test
public void testResendEmailFailIfTheProfileIsAlreadyClaimed() {
BindingResult bindingResult = mock(BindingResult.class);
when(bindingResult.hasErrors()).thenReturn(false);
when(emailManager.emailExists("billie@holiday.com")).thenReturn(true);
when(emailManager.findOrcidIdByEmail("billie@holiday.com")).thenReturn("0000-0000-0000-0000");
when(profileEntityCacheManager.retrieve(Mockito.anyString())).thenReturn(getProfileEntityToTestClaimResend(true));
EmailRequest emailRequest = new EmailRequest();
emailRequest.setEmail("billie@holiday.com");
emailRequest = claimController.resendClaimEmail(emailRequest);
assertNotNull(emailRequest);
assertNull(emailRequest.getSuccessMessage());
assertNotNull(emailRequest.getErrors());
assertFalse(emailRequest.getErrors().isEmpty());
}
@Test
public void testResendClaimEmail() {
BindingResult bindingResult = mock(BindingResult.class);
when(bindingResult.hasErrors()).thenReturn(false);
when(emailManager.emailExists("billie@holiday.com")).thenReturn(true);
when(emailManager.findOrcidIdByEmail("billie@holiday.com")).thenReturn("0000-0000-0000-0000");
when(profileEntityCacheManager.retrieve(Mockito.anyString())).thenReturn(getProfileEntityToTestClaimResend(false));
EmailRequest emailRequest = new EmailRequest();
emailRequest.setEmail("billie@holiday.com");
emailRequest = claimController.resendClaimEmail(emailRequest);
assertNotNull(emailRequest);
assertNotNull(emailRequest.getSuccessMessage());
}
@Test
@Transactional
public void testClaim() {
String email = "public_0000-0000-0000-0001@test.orcid.org";
SecurityContextHolder.getContext().setAuthentication(null);
when(profileEntityCacheManager.retrieve(Mockito.anyString())).thenReturn(getProfileEntityToTestClam(false));
when(encryptionManager.decryptForExternalUse(any(String.class))).thenReturn(email);
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
when(request.getAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE)).thenReturn(null);
when(request.getLocale()).thenReturn(java.util.Locale.US);
String orcid = "0000-0000-0000-0001";
when(emailManager.findOrcidIdByEmail(email)).thenReturn(orcid);
when(profileEntityManager.claimProfileAndUpdatePreferences(any(String.class), any(String.class), any(Locale.class), any(Claim.class))).thenReturn(true);
Claim claim = new Claim();
claim.setActivitiesVisibilityDefault(org.orcid.pojo.ajaxForm.Visibility.valueOf(Visibility.PRIVATE));
claim.setPassword(Text.valueOf("passwordTest1"));
claim.setPasswordConfirm(Text.valueOf("passwordTest1"));
Checkbox checked = new Checkbox();
checked.setValue(true);
claim.setSendChangeNotifications(checked);
claim.setSendOrcidNews(checked);
claim.setTermsOfUse(checked);
try {
claim = claimController.submitClaimJson(request, response, email, claim);
assertNotNull(claim);
assertTrue(claim.getErrors().isEmpty());
assertTrue("Value was: " + claim.getUrl(), claim.getUrl().endsWith("/my-orcid?recordClaimed"));
} catch (NoSuchRequestHandlingMethodException e) {
fail();
} catch (UnsupportedEncodingException e) {
fail();
}
}
private ProfileEntity getProfileEntityToTestClaimResend(boolean claimed) {
ProfileEntity entity = new ProfileEntity();
entity.setId("0000-0000-0000-000X");
entity.setClaimed(claimed);
Set<EmailEntity> emails = new HashSet<EmailEntity>();
EmailEntity email = new EmailEntity();
email.setId("billie@holiday.com");
email.setPrimary(true);
entity.setEmails(emails);
return entity;
}
private ProfileEntity getProfileEntityToTestClam(boolean claimed) {
ProfileEntity entity = new ProfileEntity();
entity.setId("0000-0000-0000-0001");
entity.setClaimed(claimed);
Set<EmailEntity> emails = new HashSet<EmailEntity>();
EmailEntity email = new EmailEntity();
email.setId("public_0000-0000-0000-0001@test.orcid.org");
email.setPrimary(true);
entity.setEmails(emails);
return entity;
}
}