/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.labs64.netlicensing.service;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.ws.rs.Path;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import com.labs64.netlicensing.domain.Constants;
import com.labs64.netlicensing.domain.entity.Token;
import com.labs64.netlicensing.domain.entity.impl.TokenImpl;
import com.labs64.netlicensing.domain.vo.Context;
import com.labs64.netlicensing.domain.vo.Page;
import com.labs64.netlicensing.domain.vo.TokenType;
import com.labs64.netlicensing.exception.ServiceException;
import com.labs64.netlicensing.util.DateUtils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Integration tests for {@link TokenService}.
*/
public class TokenServiceTest extends BaseServiceTest {
// *** NLIC Tests ***
private static Context context;
@Rule
public ExpectedException thrown = ExpectedException.none();
@BeforeClass
public static void setup() {
context = createContext();
}
@Test
public void testCreateEmpty() throws Exception {
final Token createdToken = TokenService.create(context, new TokenImpl());
assertNotNull(createdToken);
assertNotNull(createdToken.getNumber());
assertEquals(true, createdToken.getActive());
assertNotNull(createdToken.getExpirationTime());
assertEquals(TokenType.DEFAULT, createdToken.getTokenType());
assertEquals("VDEMO", createdToken.getVendorNumber());
}
@Test
public void testCreateEmptyApiKeyToken() throws Exception {
final TokenImpl newToken = new TokenImpl();
newToken.setTokenType(TokenType.APIKEY);
final Token createdToken = TokenService.create(context, newToken);
assertNotNull(createdToken);
assertNotNull(createdToken.getNumber());
assertEquals(true, createdToken.getActive());
assertNull(createdToken.getExpirationTime());
assertEquals(TokenType.APIKEY, createdToken.getTokenType());
assertEquals("VDEMO", createdToken.getVendorNumber());
}
@Test
public void testCreateEmptyRegistrationToken() throws Exception {
final TokenImpl newToken = new TokenImpl();
newToken.setTokenType(TokenType.REGISTRATION);
newToken.addProperty(Constants.Token.TOKEN_PROP_EMAIL, "test@test.com");
final Token createdToken = TokenService.create(context, newToken);
assertNotNull(createdToken);
assertNotNull(createdToken.getNumber());
assertEquals(true, createdToken.getActive());
assertNotNull(createdToken.getExpirationTime());
assertEquals(TokenType.REGISTRATION, createdToken.getTokenType());
assertEquals("VDEMO", createdToken.getVendorNumber());
assertEquals("test@test.com", createdToken.getTokenProperties().get(Constants.Token.TOKEN_PROP_EMAIL));
}
@Test
public void testCreateEmptyPasswordResetToken() throws Exception {
final TokenImpl newToken = new TokenImpl();
newToken.setTokenType(TokenType.PASSWORDRESET);
newToken.setVendorNumber("VDEMO2");
newToken.addProperty(Constants.Token.TOKEN_PROP_EMAIL, "test@test.com");
final Token createdToken = TokenService.create(context, newToken);
assertNotNull(createdToken);
assertNotNull(createdToken.getNumber());
assertEquals(true, createdToken.getActive());
assertNotNull(createdToken.getExpirationTime());
assertEquals(TokenType.PASSWORDRESET, createdToken.getTokenType());
assertEquals("VDEMO2", createdToken.getVendorNumber());
assertEquals("test@test.com", createdToken.getTokenProperties().get(Constants.Token.TOKEN_PROP_EMAIL));
}
@Test
public void testCreateEmptyShopToken() throws Exception {
final TokenImpl newToken = new TokenImpl();
newToken.setTokenType(TokenType.SHOP);
newToken.addProperty(Constants.Licensee.LICENSEE_NUMBER, "L001-TEST");
final Token createdToken = TokenService.create(context, newToken);
assertNotNull(createdToken);
assertNotNull(createdToken.getNumber());
assertEquals(true, createdToken.getActive());
assertNotNull(createdToken.getExpirationTime());
assertEquals(TokenType.SHOP, createdToken.getTokenType());
assertNotNull(createdToken.getTokenProperties().get(Constants.Token.TOKEN_PROP_SHOP_URL));
assertEquals("L001-TEST", createdToken.getTokenProperties().get(Constants.Licensee.LICENSEE_NUMBER));
assertEquals("VDEMO", createdToken.getVendorNumber());
}
@Test
public void testCreateRegistrationTokenWithoutEmail() throws Exception {
final TokenImpl newToken = new TokenImpl();
newToken.setTokenType(TokenType.REGISTRATION);
thrown.expect(ServiceException.class);
thrown.expectMessage("MalformedRequestException: Malformed token request, TokenValidation: Property 'email' not found");
TokenService.create(context, newToken);
}
@Test
public void testCreatePasswordResetTokenWithoutEmailAndVendorNumber() throws Exception {
final TokenImpl newToken = new TokenImpl();
newToken.setTokenType(TokenType.PASSWORDRESET);
thrown.expect(ServiceException.class);
thrown.expectMessage("MalformedRequestException: Malformed token request, TokenValidation: Property 'email' not found, TokenValidation: Property 'targetVendorNumber' not found");
TokenService.create(context, newToken);
}
@Test
public void testCreateShopTokenWithoutLicenseeNumber() throws Exception {
final TokenImpl newToken = new TokenImpl();
newToken.setTokenType(TokenType.SHOP);
thrown.expect(ServiceException.class);
thrown.expectMessage("MalformedRequestException: Malformed token request, TokenValidation: Property 'licenseeNumber' not found");
TokenService.create(context, newToken);
}
@Test
public void testGet() throws Exception {
final Token token = TokenService.get(context, "afeb41d9-314e-49be-8465-148c614badfa");
assertNotNull(token);
assertEquals("afeb41d9-314e-49be-8465-148c614badfa", token.getNumber());
assertEquals(true, token.getActive());
assertEquals(DateUtils.parseDate("2014-07-23T15:19:56.147Z").getTime(), token.getExpirationTime());
assertEquals(TokenType.SHOP, token.getTokenType());
assertEquals(
"https://go.netlicensing.io/shop/v2/?shoptoken=afeb41d9-314e-49be-8465-148c614badfa",
token.getTokenProperties().get(Constants.Token.TOKEN_PROP_SHOP_URL));
assertEquals("L001-TEST", token.getTokenProperties().get(Constants.Licensee.LICENSEE_NUMBER));
assertEquals("VDEMO", token.getVendorNumber());
}
@Test
public void testList() throws Exception {
final Page<Token> tokens = TokenService.list(context, null);
assertNotNull(tokens);
assertTrue(tokens.hasContent());
assertEquals(3, tokens.getItemsNumber());
assertEquals("08b66094-a5c4-4c93-be71-567e982d9428", tokens.getContent().get(0).getNumber());
assertEquals(DateUtils.parseDate("2014-07-22T23:07:46.742Z").getTime(), tokens.getContent().get(1)
.getExpirationTime());
assertEquals(TokenType.REGISTRATION, tokens.getContent().get(2).getTokenType());
}
@Test
public void testDelete() throws Exception {
TokenService.delete(context, "0fd9ef0a-d8dc-46e7-bc84-0a8c100a25d0");
thrown.expect(ServiceException.class);
thrown.expectMessage("NotFoundException: Requested token does not exist");
TokenService.delete(context, "00000000-0000-0000-0000-000000000000");
}
// *** NLIC test mock resource ***
@Override
protected Class<?> getResourceClass() {
return TokenServiceResource.class;
}
@Path(REST_API_PATH + "/" + Constants.Token.ENDPOINT_PATH)
public static class TokenServiceResource extends AbstractNLICServiceResource {
public TokenServiceResource() {
super("token");
}
@Override
public Response create(final MultivaluedMap<String, String> formParams) {
final String targetTokenType = formParams.getFirst(Constants.Token.TOKEN_TYPE);
if (TokenType.REGISTRATION.name().equals(targetTokenType)
&& !formParams.containsKey(Constants.Token.TOKEN_PROP_EMAIL)) {
return errorResponse("MalformedRequestException", "Malformed token request",
"TokenValidation", "Property 'email' not found");
}
if (TokenType.PASSWORDRESET.name().equals(targetTokenType)
&& !formParams.containsKey(Constants.Token.TOKEN_PROP_EMAIL)
&& !formParams.containsKey(Constants.Token.TOKEN_PROP_VENDORNUMBER)) {
return errorResponse("MalformedRequestException", "Malformed token request",
"TokenValidation", "Property 'email' not found",
"TokenValidation", "Property 'targetVendorNumber' not found");
}
if (TokenType.SHOP.name().equals(targetTokenType)
&& !formParams.containsKey(Constants.Licensee.LICENSEE_NUMBER)) {
return errorResponse("MalformedRequestException", "Malformed token request",
"TokenValidation", "Property 'licenseeNumber' not found");
}
final Map<String, String> defaultPropertyValues = new HashMap<String, String>();
defaultPropertyValues.put(Constants.NUMBER, UUID.randomUUID().toString());
defaultPropertyValues.put(Constants.ACTIVE, "true");
defaultPropertyValues.put(Constants.Token.TOKEN_TYPE, TokenType.DEFAULT.name());
defaultPropertyValues.put(Constants.Token.TOKEN_PROP_VENDORNUMBER, "VDEMO");
if (!TokenType.APIKEY.name().equals(targetTokenType)) {
defaultPropertyValues.put(Constants.Token.EXPIRATION_TIME,
DateUtils.printDate(DateUtils.getCurrentDate()));
}
if (TokenType.SHOP.name().equals(targetTokenType)) {
defaultPropertyValues.put(Constants.Token.TOKEN_PROP_SHOP_URL,
"https://go.netlicensing.io/shop/v2/?shoptoken=" +
defaultPropertyValues.get(Constants.NUMBER));
}
return create(formParams, defaultPropertyValues);
}
@Override
public Response delete(final String productNumber, final UriInfo uriInfo) {
return delete(productNumber, "0fd9ef0a-d8dc-46e7-bc84-0a8c100a25d0", null);
}
}
}