package org.socialsignin.spring.data.dynamodb.repository.support;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.socialsignin.spring.data.dynamodb.domain.sample.Playlist;
import org.socialsignin.spring.data.dynamodb.domain.sample.PlaylistId;
import org.socialsignin.spring.data.dynamodb.domain.sample.User;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMarshaller;
@RunWith(MockitoJUnitRunner.class)
@SuppressWarnings("unused")
public class DynamoDBIdIsHashAndRangeKeyEntityInformationImplUnitTest {
private DynamoDBIdIsHashAndRangeKeyEntityInformationImpl<Playlist,PlaylistId> dynamoDBPlaylistEntityInformation;
@Mock
private DynamoDBHashAndRangeKeyExtractingEntityMetadata<Playlist,PlaylistId> mockPlaylistEntityMetadata;
@Mock
private DynamoDBHashAndRangeKeyExtractingEntityMetadata<User,String> mockUserEntityMetadata;
@Mock
private Object mockHashKey;
@Mock
private Object mockRangeKey;
@SuppressWarnings("rawtypes")
@Mock
private HashAndRangeKeyExtractor mockHashAndRangeKeyExtractor;
@Mock
private User mockUserPrototype;
@Mock
private Playlist mockPlaylistPrototype;
@Mock
private PlaylistId mockPlaylistId;
@SuppressWarnings("rawtypes")
@Mock
private DynamoDBMarshaller mockPropertyMarshaller;
@SuppressWarnings("unchecked")
@Before
public void setup()
{
Mockito.when(mockPlaylistEntityMetadata.getHashAndRangeKeyExtractor(PlaylistId.class)).thenReturn(mockHashAndRangeKeyExtractor);
Mockito.when(mockHashAndRangeKeyExtractor.getHashKey(mockPlaylistId)).thenReturn(mockHashKey);
Mockito.when(mockHashAndRangeKeyExtractor.getRangeKey(mockPlaylistId)).thenReturn(mockRangeKey);
Mockito.when(mockUserEntityMetadata.getHashKeyPropertyName()).thenReturn("userHashKeyPropertyName");
Mockito.when(mockPlaylistEntityMetadata.getHashKeyPropertyName()).thenReturn("playlistHashKeyPropertyName");
Mockito.when(mockUserEntityMetadata.getHashKeyPropotypeEntityForHashKey("someUserHashKey")).thenReturn(mockUserPrototype);
Mockito.when(mockPlaylistEntityMetadata.getHashKeyPropotypeEntityForHashKey("somePlaylistHashKey")).thenReturn(mockPlaylistPrototype);
Mockito.when(mockUserEntityMetadata.getMarshallerForProperty("marshalledProperty")).thenReturn(mockPropertyMarshaller);
Mockito.when(mockPlaylistEntityMetadata.getMarshallerForProperty("marshalledProperty")).thenReturn(mockPropertyMarshaller);
Mockito.when(mockUserEntityMetadata.getOverriddenAttributeName("overriddenProperty")).thenReturn("modifiedPropertyName");
Mockito.when(mockPlaylistEntityMetadata.getOverriddenAttributeName("overriddenProperty")).thenReturn("modifiedPropertyName");
Mockito.when(mockUserEntityMetadata.isHashKeyProperty("hashKeyProperty")).thenReturn(true);
Mockito.when(mockPlaylistEntityMetadata.isHashKeyProperty("hashKeyProperty")).thenReturn(true);
Mockito.when(mockUserEntityMetadata.isHashKeyProperty("nonHashKeyProperty")).thenReturn(false);
Mockito.when(mockPlaylistEntityMetadata.isHashKeyProperty("nonHashKeyProperty")).thenReturn(false);
Mockito.when(mockUserEntityMetadata.isCompositeHashAndRangeKeyProperty("compositeIdProperty")).thenReturn(true);
Mockito.when(mockPlaylistEntityMetadata.isCompositeHashAndRangeKeyProperty("compositeIdProperty")).thenReturn(true);
Mockito.when(mockUserEntityMetadata.isCompositeHashAndRangeKeyProperty("nonCompositeIdProperty")).thenReturn(false);
Mockito.when(mockPlaylistEntityMetadata.isCompositeHashAndRangeKeyProperty("nonCompositeIdProperty")).thenReturn(false);
dynamoDBPlaylistEntityInformation = new DynamoDBIdIsHashAndRangeKeyEntityInformationImpl<Playlist,PlaylistId>(Playlist.class,mockPlaylistEntityMetadata);
}
@Test(expected=IllegalArgumentException.class)
public void testConstruct_WhenEntityDoesNotHaveFieldAnnotatedWithId_ThrowsIllegalArgumentException()
{
DynamoDBIdIsHashAndRangeKeyEntityInformationImpl<User,String> dynamoDBUserEntityInformation = new DynamoDBIdIsHashAndRangeKeyEntityInformationImpl<User,String>(User.class,mockUserEntityMetadata);
}
@Test
public void testGetId_WhenHashKeyMethodSameAsIdType_InvokesHashKeyMethod_AndReturnedIdIsAssignableToIdType_AndIsValueExpected()
{
Playlist playlist = new Playlist();
playlist.setUserName("someUserName");
playlist.setPlaylistName("somePlaylistName");
PlaylistId id = dynamoDBPlaylistEntityInformation.getId(playlist);
Assert.assertEquals("someUserName", id.getUserName());
Assert.assertEquals("somePlaylistName",id.getPlaylistName());
}
@Test
public void testGetJavaType_WhenEntityIsInstanceWithHashAndRangeKey_ReturnsEntityClass()
{
Assert.assertEquals(Playlist.class,dynamoDBPlaylistEntityInformation.getJavaType());
}
@Test
public void testGetIdType_WhenEntityIsInstanceWithHashAndRangeKey_ReturnsReturnTypeOfIdMethod()
{
Assert.assertEquals(PlaylistId.class,dynamoDBPlaylistEntityInformation.getIdType());
}
// The following tests ensure that invarient methods such as those always retuning constants, or
// that delegate to metadata, behave the same irrespective of the setup of the EntityInformation
@Test
public void testIsRangeKeyAware_ReturnsTrue()
{
Assert.assertTrue(dynamoDBPlaylistEntityInformation.isRangeKeyAware());
}
@Test
public void testGetHashKeyGivenId_WhenIdMethodFoundOnEntity_DelegatesToHashAndRangeKeyExtractorWithGivenIdValue()
{
Object hashKey = dynamoDBPlaylistEntityInformation.getHashKey(mockPlaylistId);
Assert.assertNotNull(hashKey);
Assert.assertEquals(mockHashKey,hashKey);
}
@Test
public void testGetRangeKeyGivenId_WhenIdMethodFoundOnEntity_DelegatesToHashAndRangeKeyExtractorWithGivenIdValue()
{
Object rangeKey = dynamoDBPlaylistEntityInformation.getRangeKey(mockPlaylistId);
Assert.assertNotNull(rangeKey);
Assert.assertEquals(mockRangeKey,rangeKey);
}
@Test
public void testGetPrototypeEntityForHashKey_DelegatesToDynamoDBEntityMetadata_IrrespectiveOfEntityInformationSetup()
{
Playlist playlistPrototypeEntity = new Playlist();
Mockito.when(mockPlaylistEntityMetadata.getHashKeyPropotypeEntityForHashKey("someHashKey")).thenReturn(playlistPrototypeEntity);
Object returnedPlaylistEntity = dynamoDBPlaylistEntityInformation.getHashKeyPropotypeEntityForHashKey("someHashKey");
Assert.assertEquals(playlistPrototypeEntity, returnedPlaylistEntity);
Mockito.verify(mockPlaylistEntityMetadata).getHashKeyPropotypeEntityForHashKey("someHashKey");
}
@Test
public void testGetHashKeyPropertyName_DelegatesToEntityMetadata_IrrespectiveOfEntityInformationSetup()
{
Assert.assertEquals("playlistHashKeyPropertyName", dynamoDBPlaylistEntityInformation.getHashKeyPropertyName());
}
@Test
public void testGetHashKeyPrototypeEntityForHashKey_DelegatesToEntityMetadata_IrrespectiveOfEntityInformationSetup()
{
Object hashKeyPrototype2 = dynamoDBPlaylistEntityInformation.getHashKeyPropotypeEntityForHashKey("somePlaylistHashKey");
Assert.assertEquals(mockPlaylistPrototype, hashKeyPrototype2);
}
@Test
public void testGetMarshallerForProperty_DelegatesToEntityMetadata_IrrespectiveOfEntityInformationSetup()
{
DynamoDBMarshaller<?> marshaller1 = dynamoDBPlaylistEntityInformation.getMarshallerForProperty("marshalledProperty");
Assert.assertEquals(mockPropertyMarshaller, marshaller1);
}
@Test
public void testGetOverriddenAttributeName_DelegatesToEntityMetadata_IrrespectiveOfEntityInformationSetup()
{
String propertyName2 = dynamoDBPlaylistEntityInformation.getOverriddenAttributeName("overriddenProperty");
Assert.assertEquals("modifiedPropertyName", propertyName2);
}
@Test
public void testGetIsHashKeyProperty_DelegatesToEntityMetadata_IrrespectiveOfEntityInformationSetup()
{
Assert.assertFalse(dynamoDBPlaylistEntityInformation.isHashKeyProperty("nonHashKeyProperty"));
Assert.assertFalse(dynamoDBPlaylistEntityInformation.isHashKeyProperty("nonHashKeyProperty"));
}
@Test
public void testGetIsCompositeIdProperty_DelegatesToEntityMetadata_IrrespectiveOfEntityInformationSetup()
{
Assert.assertTrue(dynamoDBPlaylistEntityInformation.isCompositeHashAndRangeKeyProperty("compositeIdProperty"));
Assert.assertFalse(dynamoDBPlaylistEntityInformation.isCompositeHashAndRangeKeyProperty("nonCompositeIdProperty"));
}
}