/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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 org.kie.workbench.common.screens.examples.client.wizard.pages.project; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import javax.enterprise.event.Event; import com.google.gwt.user.client.ui.Widget; import com.google.gwtmockito.GwtMockitoTestRunner; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.ui.client.local.spi.TranslationService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.kie.workbench.common.screens.examples.client.wizard.model.ExamplesWizardModel; import org.kie.workbench.common.screens.examples.model.ExampleProject; import org.kie.workbench.common.screens.examples.model.ExampleRepository; import org.kie.workbench.common.screens.examples.service.ExamplesService; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.Spy; import org.uberfire.backend.vfs.Path; import org.uberfire.client.callbacks.Callback; import org.uberfire.ext.widgets.core.client.wizards.WizardPageSelectedEvent; import org.uberfire.ext.widgets.core.client.wizards.WizardPageStatusChangeEvent; import org.uberfire.mocks.CallerMock; import org.uberfire.mocks.EventSourceMock; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(GwtMockitoTestRunner.class) public class ProjectPageTest { private static final String EXAMPLE_REPOSITORY = "https://github.com/guvnorngtestuser1/guvnorng-playground.git"; @Mock private ProjectPageView projectsView; @Mock private NoRepositoryURLView noRepositoryURLView; @Mock private FetchRepositoryView fetchingRepositoryView; @Mock private Widget projectsViewWidget; @Mock private Widget noRepositoryURLViewWidget; @Mock private Widget fetchingRepositoryViewWidget; @Spy private Event<WizardPageSelectedEvent> pageSelectedEvent = new EventSourceMock<WizardPageSelectedEvent>() { @Override public void fire( final WizardPageSelectedEvent event ) { //Do nothing. Default implementation throws an exception. } }; @Spy private Event<WizardPageStatusChangeEvent> pageStatusChangedEvent = new EventSourceMock<WizardPageStatusChangeEvent>() { @Override public void fire( final WizardPageStatusChangeEvent event ) { //Do nothing. Default implementation throws an exception. } }; @Mock private TranslationService translator; private ExamplesService examplesService = mock( ExamplesService.class ); private Caller<ExamplesService> examplesServiceCaller = new CallerMock<ExamplesService>( examplesService ); @Captor private ArgumentCaptor<List<ExampleProject>> projectsArgumentCaptor; private ProjectPage page; private ExamplesWizardModel model; private ExampleProject project1 = new ExampleProject( mock( Path.class ), "project1", "", Arrays.asList( "tag1", "tag2" ) ); private ExampleProject project2 = new ExampleProject( mock( Path.class ), "project2", "", Arrays.asList( "tag2", "tag3" ) ); @Before public void setup() { page = new ProjectPage( projectsView, noRepositoryURLView, fetchingRepositoryView, pageSelectedEvent, pageStatusChangedEvent, translator, examplesServiceCaller ); model = new ExamplesWizardModel(); page.setModel( model ); when( projectsView.asWidget() ).thenReturn( projectsViewWidget ); when( noRepositoryURLView.asWidget() ).thenReturn( noRepositoryURLViewWidget ); when( fetchingRepositoryView.asWidget() ).thenReturn( fetchingRepositoryViewWidget ); } @Test public void testInit() { page.init(); verify( projectsView, times( 1 ) ).init( eq( page ) ); } @Test public void testInitialise() { page.initialise(); verify( projectsView, times( 1 ) ).initialise(); } @Test public void testDestroy() { page.destroy(); verify( projectsView, times( 1 ) ).destroy(); } @Test public void testPrepareView_NoRepositorySelected() { model.setSelectedRepository( null ); page.prepareView(); assertEquals( noRepositoryURLViewWidget, page.asWidget() ); } @Test public void testPrepareView_InvalidRepositorySelected() { final ExampleRepository repository = new ExampleRepository( "cheese" ); repository.setUrlValid( false ); model.setSelectedRepository( repository ); page.prepareView(); assertEquals( noRepositoryURLViewWidget, page.asWidget() ); } @Test public void testPrepareView_SameRepositorySelected() { final ExampleRepository repository = new ExampleRepository( EXAMPLE_REPOSITORY ); model.setSourceRepository( repository ); model.setSelectedRepository( repository ); page.prepareView(); assertEquals( projectsViewWidget, page.asWidget() ); } @Test public void testPrepareView_NewRepositorySelected() { when( examplesService.getProjects( any( ExampleRepository.class ) ) ).thenReturn( new HashSet<ExampleProject>() {{ add( project1 ); add( project2 ); }} ); final ExampleRepository repository = new ExampleRepository( EXAMPLE_REPOSITORY ); model.setSelectedRepository( repository ); page.prepareView(); assertEquals( projectsViewWidget, page.asWidget() ); assertEquals( repository, model.getSourceRepository() ); assertTrue( model.getProjects().isEmpty() ); verify( projectsView, times( 1 ) ).setProjectsInRepository( projectsArgumentCaptor.capture() ); final List<ExampleProject> sortedProjects = projectsArgumentCaptor.getValue(); assertNotNull( sortedProjects ); assertEquals( 2, sortedProjects.size() ); assertEquals( "project1", sortedProjects.get( 0 ).getName() ); assertEquals( "project2", sortedProjects.get( 1 ).getName() ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } @Test @SuppressWarnings("unchecked") public void testIsComplete_NoSelectedProjects() { final Callback<Boolean> callback = mock( Callback.class ); page.isComplete( callback ); verify( callback, times( 1 ) ).callback( eq( false ) ); } @Test @SuppressWarnings("unchecked") public void testIsComplete_SelectedProjects() { model.addProject( new ExampleProject( mock( Path.class ), "", "", Collections.EMPTY_LIST) ); final Callback<Boolean> callback = mock( Callback.class ); page.isComplete( callback ); verify( callback, times( 1 ) ).callback( eq( true ) ); } @Test public void testAddProject() { page.addProject( mock( ExampleProject.class ) ); assertEquals( 1, model.getProjects().size() ); verify( pageStatusChangedEvent, times( 1 ) ).fire( any( WizardPageStatusChangeEvent.class ) ); } @Test public void testRemoveProject() { final ExampleProject project = mock( ExampleProject.class ); model.addProject( project ); page.removeProject( project ); assertEquals( 0, model.getProjects().size() ); verify( pageStatusChangedEvent, times( 1 ) ).fire( any( WizardPageStatusChangeEvent.class ) ); } @Test public void testIsProjectSelected_Selected() { final ExampleProject project = mock( ExampleProject.class ); model.addProject( project ); assertTrue( page.isProjectSelected( project ) ); } @Test public void testIsProjectSelected_NotSelected() { final ExampleProject project = mock( ExampleProject.class ); assertFalse( page.isProjectSelected( project ) ); } @Test public void testAddTag_SingleTag() { initExampleProjects(); page.addTag( "tag1" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Arrays.asList( project1 ) ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } private void initExampleProjects() { when( examplesService.getProjects( any( ExampleRepository.class ) ) ).thenReturn( new HashSet<ExampleProject>() {{ add( project1 ); add( project2 ); }} ); final ExampleRepository repository = new ExampleRepository( EXAMPLE_REPOSITORY ); model.setSelectedRepository( repository ); page.prepareView(); Mockito.reset( projectsView, pageSelectedEvent ); } @Test public void testAddTag_MultipleTags() { initExampleProjects(); page.addTag( "tag1" ); Mockito.reset( projectsView, pageSelectedEvent ); page.addTag( "tag2" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Arrays.asList( project1 ) ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } @Test public void testAddTag_NoProjectMatches() { initExampleProjects(); page.addTag( "nonMatchingTag" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Collections.emptyList() ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } @Test public void testAddTag_AllProjectsMatch() { initExampleProjects(); page.addTag( "tag2" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Arrays.asList( project1, project2 ) ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } @Test public void testRemoveTag_NonMatchingTag() { initExampleProjects(); page.addTag( "nonMatchingTag" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Collections.emptyList() ); Mockito.reset( projectsView, pageSelectedEvent ); page.removeTag( "nonMatchingTag" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Arrays.asList( project1, project2 ) ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } @Test public void testRemoveTag_MatchingTag() { initExampleProjects(); page.addTag( "tag1" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Arrays.asList( project1 ) ); Mockito.reset( projectsView, pageSelectedEvent ); page.removeTag( "tag1" ); verify( projectsView, times( 1 ) ).setProjectsInRepository( Arrays.asList( project1, project2 ) ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } @Test public void testRemoveAllTags() { initExampleProjects(); page.removeAllTags(); verify( projectsView, times( 1 ) ).setProjectsInRepository( Arrays.asList( project1, project2 ) ); verify( pageSelectedEvent, times( 1 ) ).fire( any( WizardPageSelectedEvent.class ) ); } }