/** * 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.general.file; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import blacksmyth.personalfinancier.control.IApplicationMessagePresenter; import blacksmyth.personalfinancier.model.IPreferenceItem; import static org.mockito.Mockito.*; public class FileHandlerTest { private static FileHandler<String> testHandler = new FileHandler<String>(); private static IObjectFileConverter<String> mockConverter; private static IPreferenceItem<String> mockPreference; private static IApplicationMessagePresenter mockPresenter; private static IFileHandlerModel<String> mockModel; private static final String PREFERENCE_PATH = "/this/is/a/preferred/path"; private static final String LOAD_FILE_CONTENT = "YippySkippy!"; @BeforeClass public static void testClassSetup() {} @Before public void testSetup() { buildConfigMocks(); testHandler.setObjectFileConverter(mockConverter); testHandler.setFilePathPreferenceItem(mockPreference); testHandler.setAppMessagePresenter(mockPresenter); testHandler.setModel(mockModel); } @SuppressWarnings({ "unchecked", "cast" }) private static void buildConfigMocks() { mockConverter = mock(IObjectFileConverter.class); when( mockConverter.toObjectFromFile(any(String.class)) ).thenReturn(LOAD_FILE_CONTENT); mockPresenter = mock(IApplicationMessagePresenter.class); mockPreference = (IPreferenceItem<String>) mock(IPreferenceItem.class); when( mockPreference.getPreference() ).thenReturn(PREFERENCE_PATH); mockModel = (IFileHandlerModel<String>) mock(IFileHandlerModel.class); } @Test(expected=AssertionError.class) public void Save_NoConfigSet_AssertionError() { FileHandler<String> noConfigHandler = new FileHandler<String>(); noConfigHandler.save(); } @Test(expected=AssertionError.class) public void SaveAs_NoConfigSet_AssertionError() { FileHandler<String> noConfigHandler = new FileHandler<String>(); noConfigHandler.saveAs(); } @Test(expected=AssertionError.class) public void Load_NoConfigSet_AssertionError() { FileHandler<String> noConfigHandler = new FileHandler<String>(); noConfigHandler.load(); } @Test public void Save_MandatoryFilenamePromptIgnored_NoActionTaken() { IFileHandlerView view = mock(IFileHandlerView.class); when( view.getFilename() ).thenReturn(null); when( view.promptForSaveFilename() ).thenReturn(false); testHandler.setView(view); testHandler.save(); verifyZeroInteractions(mockPresenter); verifyZeroInteractions(mockConverter); verifyZeroInteractions(mockPreference); } @Test public void Save_MandatoryFilenameSupplied_SaveActionTaken() { final String NEW_FILENAME = "newPromptedFile.txt"; IFileHandlerView view = mock(IFileHandlerView.class); when( view.getFilename() ).thenReturn(null).thenReturn(NEW_FILENAME); when( view.promptForSaveFilename() ).thenReturn(true); testHandler.setView(view); testHandler.save(); verify(mockPresenter, times(2)).setMessage(any(String.class)); verify(mockConverter).toFileFromObject(NEW_FILENAME, null); verify(mockPreference).setPreference(NEW_FILENAME); } @Test public void Save_OldFilenameUsed_SaveActionTaken() { final String OLD_FILENAME = "oldSave.txt"; IFileHandlerView view = mock(IFileHandlerView.class); when( view.getFilename() ).thenReturn(OLD_FILENAME).thenReturn(OLD_FILENAME); testHandler.setView(view); testHandler.save(); verify(mockPresenter, times(2)).setMessage(any(String.class)); verify(mockConverter).toFileFromObject(OLD_FILENAME, null); verify(mockPreference).setPreference(OLD_FILENAME); } @Test public void SaveAs_NewFilenameSupplied_SaveActionTaken() { IFileHandlerView view = mock(IFileHandlerView.class); final String NEW_SAVEAS_FILENAME = "SaveAs.txt"; when( view.promptForSaveFilename() ).thenReturn(true); when( view.getFilename() ).thenReturn(NEW_SAVEAS_FILENAME).thenReturn(NEW_SAVEAS_FILENAME); testHandler.setView(view); testHandler.saveAs(); verify(mockPresenter, times(2)).setMessage(any(String.class)); verify(mockConverter).toFileFromObject(NEW_SAVEAS_FILENAME, null); verify(mockPreference).setPreference(NEW_SAVEAS_FILENAME); } @Test public void SaveAs_FilenamePromptIgnored_NoActionTaken() { IFileHandlerView view = mock(IFileHandlerView.class); when( view.promptForSaveFilename() ).thenReturn(false); testHandler.setView(view); testHandler.saveAs(); verifyZeroInteractions(mockPresenter); verifyZeroInteractions(mockConverter); verifyZeroInteractions(mockPreference); } @Test public void Load_FilenameSupplied_LoadSucceeded() { final String NEW_LOAD_FILENAME = "NewLoad.txt"; IFileHandlerView view = mock(IFileHandlerView.class); when( view.promptForLoadFilename() ).thenReturn(true); when( view.getFilename() ).thenReturn(NEW_LOAD_FILENAME).thenReturn(NEW_LOAD_FILENAME); testHandler.setView(view); testHandler.load(); verify(mockPresenter, times(2)).setMessage(any(String.class)); verify(view).setPromptDirectory(PREFERENCE_PATH); verify(mockConverter).toObjectFromFile(NEW_LOAD_FILENAME); verify(mockModel).fromSerializable(LOAD_FILE_CONTENT); verify(mockPreference).setPreference(NEW_LOAD_FILENAME); } @Test public void Load_FilenamePromptIgnored_NoActionTaken() { IFileHandlerView view = mock(IFileHandlerView.class); when( view.promptForLoadFilename() ).thenReturn(false); testHandler.setView(view); testHandler.load(); verifyZeroInteractions(mockPresenter); verifyZeroInteractions(mockConverter); } }