/** * Copyright (c) Codice Foundation * <p/> * This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation, either version 3 of the * License, or any later version. * <p/> * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. */ package org.codice.ddf.catalog.actions; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Collections; import org.codice.ddf.configuration.SystemBaseUrl; import org.codice.ddf.configuration.SystemInfo; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import ddf.action.Action; import ddf.catalog.data.Metacard; @RunWith(MockitoJUnitRunner.class) public class AbstractMetacardActionProviderTest { private static final String ACTION_ID = "id"; private static final String TITLE = "title"; private static final String DESCRIPTION = "description"; private static final String METACARD_ID = "metacard_id"; private static final String SOURCE_ID = "source_id"; private static URL url; @Mock private Metacard metacard; @Mock private Action action; @BeforeClass public static void setupClass() throws MalformedURLException { url = new URL("https://localhost/action"); } @Before public void setup() { when(metacard.getId()).thenReturn(METACARD_ID); when(metacard.getSourceId()).thenReturn(SOURCE_ID); when(metacard.getTags()).thenReturn(Collections.singleton(Metacard.DEFAULT_TAG)); } private class MetacardActionProvider extends AbstractMetacardActionProvider { MetacardActionProvider(String actionProviderId, String title, String description) { super(actionProviderId, title, description); } @Override protected boolean canHandleMetacard(Metacard metacard) { return super.canHandleMetacard(metacard); } @Override protected Action createMetacardAction(String actionProviderId, String title, String description, URL url) { return null; } @Override protected URL getMetacardActionUrl(String metacardSource, Metacard metacard) throws Exception { return new URL("https://localhost/action"); } } @Test(expected = NullPointerException.class) public void constructorWithNullActionProviderId() { new MetacardActionProvider(null, TITLE, DESCRIPTION); } @Test(expected = IllegalArgumentException.class) public void constructorWithBlankActionProviderId() { new MetacardActionProvider(" ", TITLE, DESCRIPTION); } @Test(expected = NullPointerException.class) public void constructorWithNullTitle() { new MetacardActionProvider(ACTION_ID, null, DESCRIPTION); } @Test(expected = NullPointerException.class) public void constructorWithNullDescription() { new MetacardActionProvider(ACTION_ID, TITLE, null); } @Test public void canHandleWithNull() { MetacardActionProvider actionProvider = createMetacardActionProvider(); assertThat(actionProvider.canHandle(null), is(false)); verify(actionProvider, never()).canHandleMetacard(any()); } @Test public void canHandleWithNonMetacard() { MetacardActionProvider actionProvider = createMetacardActionProvider(); assertThat(actionProvider.canHandle("blah"), is(false)); verify(actionProvider, never()).canHandleMetacard(any()); } @Test public void canHandleDelegatesToCanHandleMetacard() { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(actionProvider.canHandleMetacard(metacard)).thenReturn(true); assertThat(actionProvider.canHandle(metacard), is(true)); verify(actionProvider).canHandleMetacard(metacard); } @Test public void canHandleMetacardWithoutResourceTag() { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(metacard.getTags()).thenReturn(Collections.singleton("my-tag")); assertThat(actionProvider.canHandle(metacard), is(false)); verify(actionProvider, never()).canHandleMetacard(metacard); } @Test public void getActionsWithNull() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); Action action = actionProvider.getAction(null); assertThat(action, is(nullValue())); verify(actionProvider, never()).getMetacardAction(any(), any()); } @Test public void getActionsWithNonMetacard() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); Action action = actionProvider.getAction("blah"); assertThat(action, is(nullValue())); verify(actionProvider, never()).getMetacardAction(any(), any()); } @Test public void getActionsWithMetacardThatHasNullId() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(metacard.getId()).thenReturn(null); Action action = actionProvider.getAction(metacard); assertThat(action, is(nullValue())); verify(actionProvider, never()).getMetacardAction(any(), any()); } @Test public void getActionsWithMetacardThatHasBlankId() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(metacard.getId()).thenReturn(" "); Action action = actionProvider.getAction(metacard); assertThat(action, is(nullValue())); verify(actionProvider, never()).getMetacardAction(any(), any()); } @Test public void getActionsWhenHostNotSet() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(actionProvider.canHandleMetacard(metacard)).thenReturn(true); when(actionProvider.createMetacardAction(eq(ACTION_ID), eq(TITLE), eq(DESCRIPTION), any())).thenReturn(action); when(actionProvider.getMetacardActionUrl(SOURCE_ID, metacard)).thenReturn(url); System.clearProperty(SystemBaseUrl.HOST); Action action = actionProvider.getAction(metacard); assertThat(action, is(this.action)); verify(actionProvider).createMetacardAction(ACTION_ID, TITLE, DESCRIPTION, url); } @Test public void getActionsWhenHostUnknown() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(actionProvider.canHandleMetacard(metacard)).thenReturn(true); when(actionProvider.createMetacardAction(eq(ACTION_ID), eq(TITLE), eq(DESCRIPTION), any())).thenReturn(action); when(actionProvider.getMetacardActionUrl(SOURCE_ID, metacard)).thenReturn(url); System.setProperty(SystemBaseUrl.HOST, "0.0.0.0"); Action action = actionProvider.getAction(metacard); assertThat(action, is(nullValue())); verify(actionProvider, never()).getMetacardAction(any(), any()); } @Test public void getActionsWhenSubclassCannotHandleMetacard() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(actionProvider.canHandleMetacard(metacard)).thenReturn(false); Action action = actionProvider.getAction(metacard); assertThat(action, is(nullValue())); verify(actionProvider, never()).getMetacardAction(any(), any()); } @Test public void getActions() { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(actionProvider.createMetacardAction(eq(ACTION_ID), eq(TITLE), eq(DESCRIPTION), any())).thenReturn(action); System.setProperty(SystemBaseUrl.HOST, "codice.org"); Action action = actionProvider.getAction(metacard); assertThat(action, is(this.action)); } @Test public void getActionsWhenGetMetacardActionFails() { MetacardActionProvider actionProvider = new MetacardActionProvider(ACTION_ID, TITLE, DESCRIPTION) { @Override protected URL getMetacardActionUrl(String metacardSource, Metacard metacard) throws IOException { throw new IOException(); } }; System.setProperty(SystemBaseUrl.HOST, "codice.org"); Action action = actionProvider.getAction(metacard); assertThat(action, is(nullValue())); } @Test public void getActionsWhenMetacardSourceIdIsNull() throws Exception { MetacardActionProvider actionProvider = createMetacardActionProvider(); when(metacard.getSourceId()).thenReturn(null); System.setProperty(SystemBaseUrl.HOST, "codice.org"); System.setProperty(SystemInfo.SITE_NAME, "ddf"); when(actionProvider.createMetacardAction(eq(ACTION_ID), eq(TITLE), eq(DESCRIPTION), any())).thenReturn(action); Action action = actionProvider.getAction(metacard); assertThat(action, is(this.action)); verify(actionProvider).getMetacardAction("ddf", metacard); } private MetacardActionProvider createMetacardActionProvider() { return spy(new MetacardActionProvider(ACTION_ID, TITLE, DESCRIPTION)); } }