/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.view.internal.ribbon;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import com.google.common.collect.Lists;
import com.qcadoo.view.api.ribbon.RibbonActionItem;
import com.qcadoo.view.internal.api.ViewDefinition;
import com.qcadoo.view.internal.ribbon.model.InternalRibbonActionItem;
import com.qcadoo.view.internal.ribbon.model.InternalRibbonGroup;
import com.qcadoo.view.internal.ribbon.model.RibbonGroupImpl;
import com.qcadoo.view.internal.ribbon.model.RibbonGroupsPack;
import com.qcadoo.view.internal.ribbon.templates.RibbonTemplateParameters;
import com.qcadoo.view.internal.ribbon.templates.model.RibbonTemplate;
import com.qcadoo.view.internal.ribbon.templates.model.TemplateRibbonGroupsPack;
public class TemplateRibbonGroupsPackTest {
private TemplateRibbonGroupsPack templateRibbonGroupsPack;
@Mock
private RibbonTemplate template;
@Mock
private ViewDefinition viewDefinition;
private List<InternalRibbonGroup> groupsResult1;
private List<InternalRibbonGroup> groupsResult2;
@Before
public final void init() {
MockitoAnnotations.initMocks(this);
templateRibbonGroupsPack = new TemplateRibbonGroupsPack(template, null, viewDefinition);
}
@SuppressWarnings("unchecked")
@Test
public final void shouldGetGroupsAlwaysReturnTheSameInstancesOfItems() throws Exception {
// given
groupsResult1 = Lists.newArrayList(getInternalRibbonGroup("first", null, null),
getInternalRibbonGroup("second", null, null));
groupsResult2 = Lists.newArrayList(getInternalRibbonGroup("first", null, null),
getInternalRibbonGroup("second", null, null));
stubTemplateGetRibbonGroups(groupsResult1, groupsResult2);
// when
List<InternalRibbonGroup> groups1 = templateRibbonGroupsPack.getGroups();
List<InternalRibbonGroup> groups2 = templateRibbonGroupsPack.getGroups();
// then
assertRibbonGroupsEquals(groups1, groups2);
}
@SuppressWarnings("unchecked")
@Test
public final void shouldGetGroupsUpdatedByTemplate() throws Exception {
// given
groupsResult1 = Lists.newArrayList(getInternalRibbonGroup("first", null, null),
getInternalRibbonGroup("second", null, null));
groupsResult2 = Lists.newArrayList(getInternalRibbonGroup("first", null, null),
getInternalRibbonGroup("second", null, null), getInternalRibbonGroup("third", null, null));
stubTemplateGetRibbonGroups(groupsResult1, groupsResult2);
// when
List<InternalRibbonGroup> groups1 = templateRibbonGroupsPack.getGroups();
List<InternalRibbonGroup> groups2 = templateRibbonGroupsPack.getGroups();
// then
Assert.assertEquals(3, groups2.size());
Assert.assertTrue(groups2.containsAll(groups1));
Assert.assertTrue(groups2.contains(getInternalRibbonGroup("third", null, null)));
}
@Test
public final void shouldGetUpdateReturnNullIfUpdateGroupsListIsEmpty() throws Exception {
// when
RibbonGroupsPack ribbonGroupsPackUpdate = templateRibbonGroupsPack.getUpdate();
// then
Assert.assertNull(ribbonGroupsPackUpdate);
}
@Test
public final void shouldNotCallTemplateFromUpdateInfoPack() throws Exception {
// given
InternalRibbonGroup internalRibbonGroup = mock(InternalRibbonGroup.class);
given(internalRibbonGroup.getUpdate()).willReturn(internalRibbonGroup);
stubTemplateGetRibbonGroups(Lists.newArrayList(internalRibbonGroup));
RibbonGroupsPack ribbonGroupsPackUpdate = templateRibbonGroupsPack.getUpdate();
template = mock(RibbonTemplate.class); // Flush
// when
ribbonGroupsPackUpdate.getGroups();
// then
verify(template, never()).getRibbonGroups(Mockito.any(RibbonTemplateParameters.class), Mockito.eq(viewDefinition));
}
private void assertRibbonGroupsEquals(final List<InternalRibbonGroup> expected, final List<InternalRibbonGroup> actual) {
Assert.assertEquals(expected.size(), actual.size());
for (int i = 0; i < expected.size(); i++) {
Assert.assertEquals(expected.get(i), actual.get(i));
}
}
private void stubTemplateGetRibbonGroups(final List<InternalRibbonGroup> group, final List<InternalRibbonGroup>... groups) {
given(template.getRibbonGroups(Mockito.any(RibbonTemplateParameters.class), Mockito.eq(viewDefinition))).willReturn(
group, groups);
}
private InternalRibbonGroup getInternalRibbonGroup(final String name, final String extensionPluginIdentifier,
final List<RibbonActionItem> items) {
InternalRibbonGroup ribbonGroup = new RibbonGroupImpl(name);
ribbonGroup.setExtensionPluginIdentifier(extensionPluginIdentifier);
if (items != null) {
for (RibbonActionItem item : items) {
ribbonGroup.addItem((InternalRibbonActionItem) item);
}
}
return ribbonGroup;
}
}