/** * Copyright (c) 2012, Lindsay Bradford and other Contributors. * All rights reserved. * * This program and the accompanying materials are made available * under the terms of the BSD 3-Clause licence which accompanies * this distribution, and is available at * http://opensource.org/licenses/BSD-3-Clause */ package blacksmyth.personalfinancier.control; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; import blacksmyth.general.file.IFileSystemBridge; import blacksmyth.personalfinancier.dependencies.encryption.IEncryptionBridge; import blacksmyth.personalfinancier.dependencies.json.EncryptedJSonFileConverter; import blacksmyth.personalfinancier.dependencies.json.IJSonSerialisationBridge; import blacksmyth.personalfinancier.dependencies.json.JSonObjectFileConverter; import blacksmyth.personalfinancier.view.IPasswordPromptView; public class EncryptedJSonFileConverterTest { private EncryptedJSonFileConverter<String> testConverter; private IPasswordPromptView mockView; private IPasswordPromptView noPasswordView; private IPasswordPromptView validPasswordView; private IPasswordPromptView invalidPasswordView; private IFileSystemBridge mockFileSystemBridge; private IJSonSerialisationBridge<String> mockJSonBridge; private IEncryptionBridge mockEncryptionBridge; private static final String JSON_PARSE_RESULT = "JSonSaveResult"; private static final char[] VALID_PASSWORD = "BinkyIsMyNewRide".toCharArray(); private static final char[] INVALID_PASSWORD = "BinkyIsMyNewRider".toCharArray(); final byte[] RAW_CONTENT = { 0,1,2,3,4,5,6,7 }; @SuppressWarnings({"unchecked", "cast"}) @Before public void testSetup() { testConverter = new EncryptedJSonFileConverter<String>(); mockView = mock(IPasswordPromptView.class); testConverter.setView(mockView); noPasswordView = mock(IPasswordPromptView.class); when( noPasswordView.passwordSpecified() ).thenReturn( false ); invalidPasswordView = mock(IPasswordPromptView.class); when( invalidPasswordView.passwordSpecified() ).thenReturn( true ); when( invalidPasswordView.getPassword() ).thenReturn( INVALID_PASSWORD ); validPasswordView = mock(IPasswordPromptView.class); when( validPasswordView.passwordSpecified() ).thenReturn( true ); when( validPasswordView.getPassword() ).thenReturn( VALID_PASSWORD ); mockFileSystemBridge = mock(IFileSystemBridge.class); when( mockFileSystemBridge.loadBinaryFile( any(String.class) ) ).thenReturn( RAW_CONTENT ); testConverter.setFileSystemBridge(mockFileSystemBridge); mockJSonBridge = (IJSonSerialisationBridge<String>) mock(IJSonSerialisationBridge.class); when( mockJSonBridge.toJSon( any(String.class) ) ).thenReturn( JSON_PARSE_RESULT ); testConverter.setJSonBridge(mockJSonBridge); mockEncryptionBridge = mock(IEncryptionBridge.class); when( mockEncryptionBridge.decrypt( eq(VALID_PASSWORD), any(byte[].class) ) ).thenReturn( RAW_CONTENT ); when( mockEncryptionBridge.decrypt( eq(INVALID_PASSWORD), any(byte[].class) ) ).thenReturn( null ); testConverter.setEncryptionBridge(mockEncryptionBridge); } @Test(expected=AssertionError.class) public void ToFileFromObject_InvalidConfig_AssertionError() { JSonObjectFileConverter<String> converter = new JSonObjectFileConverter<String>(); converter.toFileFromObject("test", "fart"); } @Test(expected=AssertionError.class) public void ToObjectFromFile_InvalidConfig_AssertionError() { JSonObjectFileConverter<String> converter = new JSonObjectFileConverter<String>(); converter.toObjectFromFile("test"); } @Test public void ToFileFromObject_NoPasswordSpecified_NoActionTaken() { testConverter.setView(noPasswordView); testConverter.toFileFromObject("test", "fart"); verify(noPasswordView).displaySavePrompt(); verify(noPasswordView).passwordSpecified(); verifyZeroInteractions(mockEncryptionBridge); verifyZeroInteractions(mockJSonBridge); } @Test public void ToObjectFromFile_NoPasswordSpecified_NoActionTaken() { testConverter.setView(noPasswordView); testConverter.toObjectFromFile("test"); verify(noPasswordView).displayLoadPrompt(); verify(noPasswordView).passwordSpecified(); verifyZeroInteractions(mockEncryptionBridge); verifyZeroInteractions(mockJSonBridge); } @Test public void ToFileFromObject_PasswordSpecified_ActionTaken() { testConverter.setView(validPasswordView); testConverter.toFileFromObject("test", "fart"); verify(validPasswordView).displaySavePrompt(); verify(validPasswordView).passwordSpecified(); verify(validPasswordView).getPassword(); verify(mockJSonBridge).toJSon("fart"); verify(mockEncryptionBridge).encrypt( eq(VALID_PASSWORD), any(byte[].class) ); verify(mockFileSystemBridge).saveBinaryFile( eq("test"), any(byte[].class) ); verify(validPasswordView).clearPassword(); } @Test public void ToObjectFromFile_CorrectPasswordSpecified_ActionTaken() { testConverter.setView(validPasswordView); testConverter.toObjectFromFile("test"); verify(validPasswordView).displayLoadPrompt(); verify(validPasswordView).passwordSpecified(); verify(validPasswordView).getPassword(); verify(mockEncryptionBridge).decrypt( eq(VALID_PASSWORD), any(byte[].class) ); verify(mockFileSystemBridge).loadBinaryFile("test"); verify(validPasswordView).clearPassword(); verify(mockJSonBridge).fromJSon(any(String.class)); } @Test public void ToObjectFromFile_IncorrectPasswordSpecified_ActionFailed() { testConverter.setView(invalidPasswordView); testConverter.toObjectFromFile("test"); verify(invalidPasswordView).displayLoadPrompt(); verify(invalidPasswordView).passwordSpecified(); verify(invalidPasswordView).getPassword(); verify(mockEncryptionBridge).decrypt( INVALID_PASSWORD, RAW_CONTENT ); verify(mockFileSystemBridge).loadBinaryFile("test"); verify(invalidPasswordView).clearPassword(); verify(invalidPasswordView).displayError(any(String.class)); } }