/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2016 The ZAP Development Team
*
* 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.zaproxy.zap.users;
import static org.hamcrest.Matchers.arrayContaining;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.emptyArray;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TableModelListener;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.mockito.internal.util.reflection.Whitebox;
import org.parosproxy.paros.Constant;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.zaproxy.zap.extension.users.UsersTableModel;
import org.zaproxy.zap.utils.I18N;
import org.zaproxy.zap.view.TableModelTestUtils;
/**
* Unit test for {@code UsersTableModel}.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(Constant.class)
public class UsersTableModelUnitTest extends TableModelTestUtils {
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockConstantClass();
}
private void mockConstantClass() {
Constant constant = PowerMockito.mock(Constant.class);
I18N i18n = PowerMockito.mock(I18N.class);
given(i18n.getString(anyString())).willReturn("");
given(i18n.getString(anyString(), anyObject())).willReturn("");
Whitebox.setInternalState(constant, "messages", i18n);
}
@Test(expected = NullPointerException.class)
public void shouldFailToCreateInstanceWithUndefinedUsersList() {
// Given
List<User> undefinedUsersList = null;
// When
UsersTableModel usersTableModel = new UsersTableModel(undefinedUsersList);
// Then = NullPointerException
}
@Test
public void shouldAddTableModelListeners() {
// Given
TableModelListener listener = createTestTableModelListener();
UsersTableModel usersTableModel = new UsersTableModel();
// When
usersTableModel.addTableModelListener(listener);
// Then
assertThat(usersTableModel.getTableModelListeners(), is(arrayContaining(listener)));
}
@Test
public void shouldRemoveTableModelListeners() {
// Given
TableModelListener listener = createTestTableModelListener();
UsersTableModel usersTableModel = new UsersTableModel();
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.removeTableModelListener(listener);
// Then
assertThat(usersTableModel.getTableModelListeners(), is(emptyArray()));
}
@Test
public void shouldHaveJustThreeColumns() {
// Given
UsersTableModel usersTableModel = new UsersTableModel();
// When / Then
assertThat(usersTableModel.getColumnCount(), is(equalTo(3)));
assertThat(usersTableModel.getColumnName(0), is(notNullValue()));
assertThat(usersTableModel.getColumnName(1), is(notNullValue()));
assertThat(usersTableModel.getColumnName(2), is(notNullValue()));
}
@Test
public void shouldBeEditableJustTheFirstColumnEvenIfHasNoUsers() {
// Given
UsersTableModel usersTableModel = new UsersTableModel();
// When / Then
assertThat(usersTableModel.isCellEditable(0, 0), is(equalTo(true)));
assertThat(usersTableModel.isCellEditable(0, 1), is(equalTo(false)));
}
@Test
public void shouldNotHaveUsersByDefault() {
// Given
UsersTableModel usersTableModel = new UsersTableModel();
// When / Then
assertThat(usersTableModel.getRowCount(), is(equalTo(0)));
assertThat(usersTableModel.getUsers(), is(empty()));
assertThat(usersTableModel.getElements(), is(empty()));
}
@Test(expected = IndexOutOfBoundsException.class)
public void shouldFailToGetValueOfNonExistingRow() {
// Given
UsersTableModel usersTableModel = new UsersTableModel();
// When
usersTableModel.getValueAt(0, 0);
// Then = IndexOutOfBoundsException
}
@Test
public void shouldCreateInstanceWithUsersList() {
// Given
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createUser());
usersList.add(createUser());
// When
UsersTableModel usersTableModel = new UsersTableModel(usersList);
// Then
assertThat(usersTableModel.getRowCount(), is(equalTo(usersList.size())));
assertThat(usersTableModel.getUsers(), is(equalTo(usersList)));
assertThat(usersTableModel.getElements(), is(equalTo(usersList)));
}
@Test
public void shouldReturnUserEnabledStateFromFirstColumn() {
// Given
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createEnabledUser());
// When
UsersTableModel usersTableModel = new UsersTableModel(usersList);
// Then
assertTrue(usersTableModel.getColumnClass(0) == Boolean.class);
assertThat(usersTableModel.getValueAt(0, 0), is(equalTo((Object) false)));
assertThat(usersTableModel.getValueAt(1, 0), is(equalTo((Object) true)));
}
@Test
public void shouldReturnUserIdFromSecondColumn() {
// Given
List<User> usersList = new ArrayList<>();
User user1 = createUser();
int user1Id = user1.getId();
usersList.add(user1);
User user2 = createUser();
int user2Id = user2.getId();
usersList.add(user2);
// When
UsersTableModel usersTableModel = new UsersTableModel(usersList);
// Then
assertTrue(usersTableModel.getColumnClass(1) == Integer.class);
assertThat(usersTableModel.getValueAt(0, 1), is(equalTo((Object) Integer.valueOf(user1Id))));
assertThat(usersTableModel.getValueAt(1, 1), is(equalTo((Object) Integer.valueOf(user2Id))));
}
@Test
public void shouldReturnUserNameFromThirdColumn() {
// Given
List<User> usersList = new ArrayList<>();
usersList.add(createUser("User 1"));
usersList.add(createUser("User 2"));
// When
UsersTableModel usersTableModel = new UsersTableModel(usersList);
// Then
assertTrue(usersTableModel.getColumnClass(2) == String.class);
assertThat(usersTableModel.getValueAt(0, 2), is(equalTo((Object) "User 1")));
assertThat(usersTableModel.getValueAt(1, 2), is(equalTo((Object) "User 2")));
}
@Test
public void shouldReturnNullValueAndColumnClassForNonExistingColumns() {
// Given
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
// When
UsersTableModel usersTableModel = new UsersTableModel(usersList);
// Then
assertThat(usersTableModel.getColumnClass(3), is(equalTo(null)));
assertThat(usersTableModel.getValueAt(0, 3), is(equalTo(null)));
}
@Test
public void shouldChangeUsersEnabledState() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.setValueAt(true, 0, 0);
usersTableModel.setValueAt(false, 1, 0);
// Then
assertThat(usersTableModel.getValueAt(0, 0), is(equalTo((Object) true)));
assertThat(usersTableModel.getValueAt(1, 0), is(equalTo((Object) false)));
assertThat(listener.getNumberOfEvents(), is(equalTo(2)));
assertThat(listener.isCellChanged(0, 0), is(equalTo(true)));
assertThat(listener.isCellChanged(1, 0), is(equalTo(true)));
}
@Test
public void shouldNotChangeUsersEnabledStateIfNonBooleanOrFirstColumn() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.setValueAt(Integer.valueOf(15), 0, 0);
usersTableModel.setValueAt("Some Value", 1, 0);
usersTableModel.setValueAt(true, 1, 1);
// Then
assertThat(listener.getNumberOfEvents(), is(equalTo(0)));
assertThat(usersTableModel.getValueAt(0, 0), is(equalTo((Object) false)));
assertThat(usersTableModel.getValueAt(1, 0), is(equalTo((Object) true)));
}
@Test
public void shouldEnableAllUsers() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.setAllEnabled(true);
// Then
assertThat(usersTableModel.getValueAt(0, 0), is(equalTo((Object) true)));
assertThat(usersTableModel.getValueAt(1, 0), is(equalTo((Object) true)));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isCellChanged(0, 0), is(equalTo(true)));
assertThat(listener.isCellChanged(1, 0), is(equalTo(true)));
}
@Test
public void shouldDisableAllUsers() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.setAllEnabled(false);
// Then
assertThat(usersTableModel.getValueAt(0, 0), is(equalTo((Object) false)));
assertThat(usersTableModel.getValueAt(1, 0), is(equalTo((Object) false)));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isCellChanged(0, 0), is(equalTo(true)));
assertThat(listener.isCellChanged(1, 0), is(equalTo(true)));
}
@Test
public void shouldNotNotifyOfEnabledStateChangesIfItHasNoUsers() {
// Given
TestTableModelListener listener = createTestTableModelListener();
UsersTableModel usersTableModel = new UsersTableModel();
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.setAllEnabled(true);
// Then
assertThat(listener.getNumberOfEvents(), is(equalTo(0)));
}
@Test(expected = IndexOutOfBoundsException.class)
public void shouldFailToGetNonExistingElement() {
// Given
UsersTableModel usersTableModel = new UsersTableModel();
// When
usersTableModel.getElement(1);
// Then = IndexOutOfBoundsException
}
@Test
public void shouldAddElement() {
// Given
TestTableModelListener listener = createTestTableModelListener();
UsersTableModel usersTableModel = new UsersTableModel();
usersTableModel.addTableModelListener(listener);
User user = createUser();
// When
usersTableModel.addElement(user);
// Then
assertThat(usersTableModel.getRowCount(), is(equalTo(1)));
assertThat(usersTableModel.getElements().size(), is(equalTo(1)));
assertThat(usersTableModel.getElements().get(0), is(equalTo(user)));
assertThat(usersTableModel.getElement(0), is(equalTo(user)));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isRowInserted(0), is(equalTo(true)));
}
@Test
public void shouldAddUser() {
// Given
TestTableModelListener listener = createTestTableModelListener();
UsersTableModel usersTableModel = new UsersTableModel();
usersTableModel.addTableModelListener(listener);
User user = createUser();
// When
usersTableModel.addUser(user);
// Then
assertThat(usersTableModel.getRowCount(), is(equalTo(1)));
assertThat(usersTableModel.getUsers().size(), is(equalTo(1)));
assertThat(usersTableModel.getUsers().get(0), is(equalTo(user)));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isRowInserted(0), is(equalTo(true)));
}
@Test(expected = IndexOutOfBoundsException.class)
public void shouldFailToModifyNonExistingElement() {
// Given
List<User> usersList = new ArrayList<>();
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
// When
usersTableModel.modifyElement(1, createUser());
// Then = IndexOutOfBoundsException
}
@Test
public void shouldModifyElement() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
User user2 = createUser("User 2");
// When
usersTableModel.modifyElement(0, user2);
// Then
assertThat(usersTableModel.getElements().size(), is(equalTo(1)));
assertThat(usersTableModel.getElements().get(0), is(equalTo(user2)));
assertThat(usersTableModel.getElement(0), is(equalTo(user2)));
assertThat(usersTableModel.getUsers().size(), is(equalTo(1)));
assertThat(usersTableModel.getUsers().get(0), is(equalTo(user2)));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isRowUpdated(0), is(equalTo(true)));
}
@Test(expected = IndexOutOfBoundsException.class)
public void shouldFailToRemoveNonExistingElement() {
// Given
UsersTableModel usersTableModel = new UsersTableModel();
// When
usersTableModel.removeElement(1);
// Then = IndexOutOfBoundsException
}
@Test
public void shouldRemoveElement() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
User user = createUser();
usersList.add(user);
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.removeElement(1);
// Then
assertThat(usersTableModel.getRowCount(), is(equalTo(1)));
assertThat(usersTableModel.getElements().size(), is(equalTo(1)));
assertThat(usersTableModel.getElements().get(0), is(equalTo(user)));
assertThat(usersTableModel.getElement(0), is(equalTo(user)));
assertThat(usersTableModel.getUsers().size(), is(equalTo(1)));
assertThat(usersTableModel.getUsers().get(0), is(equalTo(user)));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isRowRemoved(1), is(equalTo(true)));
}
@Test
public void shouldClearElements() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.clear();
// Then
assertThat(usersTableModel.getRowCount(), is(equalTo(0)));
assertThat(usersTableModel.getElements(), is(empty()));
assertThat(usersTableModel.getUsers(), is(empty()));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isDataChanged(), is(equalTo(true)));
}
@Test
public void shouldRemoveAllUsers() {
// Given
TestTableModelListener listener = createTestTableModelListener();
List<User> usersList = new ArrayList<>();
usersList.add(createUser());
usersList.add(createEnabledUser());
UsersTableModel usersTableModel = new UsersTableModel(usersList);
usersTableModel.addTableModelListener(listener);
// When
usersTableModel.removeAllUsers();
// Then
assertThat(usersTableModel.getRowCount(), is(equalTo(0)));
assertThat(usersTableModel.getElements(), is(empty()));
assertThat(usersTableModel.getUsers(), is(empty()));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isDataChanged(), is(equalTo(true)));
}
@Test
public void shouldSetUsers() {
// Given
TestTableModelListener listener = createTestTableModelListener();
UsersTableModel usersTableModel = new UsersTableModel();
usersTableModel.addTableModelListener(listener);
List<User> usersList = new ArrayList<>();
User user = createUser();
usersList.add(user);
// When
usersTableModel.setUsers(usersList);
// Then
assertThat(usersTableModel.getRowCount(), is(equalTo(1)));
assertThat(usersTableModel.getElements().size(), is(equalTo(1)));
assertThat(usersTableModel.getElements().get(0), is(equalTo(user)));
assertThat(usersTableModel.getElement(0), is(equalTo(user)));
assertThat(usersTableModel.getUsers().size(), is(equalTo(1)));
assertThat(usersTableModel.getUsers().get(0), is(equalTo(user)));
assertThat(listener.getNumberOfEvents(), is(equalTo(1)));
assertThat(listener.isDataChanged(), is(equalTo(true)));
}
private static User createUser() {
return createUser("User");
}
private static User createUser(String name) {
return new User(1, name);
}
private User createEnabledUser() {
User user = createUser();
user.setEnabled(true);
return user;
}
}