package org.ff4j.test;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/*
* #%L
* ff4j-core
* %%
* Copyright (C) 2013 Ff4J
* %%
* 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.
* #L%
*/
import org.ff4j.FF4j;
import org.ff4j.property.Property;
import org.junit.Assert;
/**
* Give utilities method for tests.
*
* @author <a href="mailto:cedrick.lunven@gmail.com">Cedrick LUNVEN</a>
*/
public class AssertFf4j {
/** error message. */
public static final String IS_MANDATORY = "' is mandatory";
/** error message. */
public static final String FEATURE = "Feature '";
/** reference to ff4j context. */
private final FF4j ff4j;
private int pause;
/**
* Initialisation with current ff4j context.
*
* @param ff4j
* current ff4k context
*/
public AssertFf4j(FF4j cff4j) {
this.ff4j = cff4j;
this.pause = 0;
}
public void setPause(int pause) {
this.pause = pause;
}
/**
* Check existence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureExist(String featureName) {
Assert.assertTrue(FEATURE + featureName + IS_MANDATORY, ff4j.exist(featureName));
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget property
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatPropertyExist(String propertyName) {
Assert.assertTrue("Property '" + propertyName + IS_MANDATORY,
ff4j.getPropertiesStore().existProperty(propertyName));
waitSomeSeconds();
return this;
}
/**
* Check inexistence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureDoesNotExist(String featureName) {
Assert.assertFalse(FEATURE + featureName + "' must not exist", ff4j.exist(featureName));
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget property
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatPropertyDoesNotExist(String propertyName) {
Assert.assertFalse("Property '" + propertyName + IS_MANDATORY,
ff4j.getPropertiesStore().existProperty(propertyName));
waitSomeSeconds();
return this;
}
/**
* Check Feature Flipped
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatFeatureFlipped(String featureName) {
assertThatFeatureExist(featureName);
Assert.assertTrue("'" + featureName + "' is not flipped where it should", ff4j.check(featureName));
waitSomeSeconds();
return this;
}
/**
* Check Feature Flipped
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatFeatureNotFlipped(String featureName) {
assertThatFeatureExist(featureName);
Assert.assertFalse("'" + featureName + "' is flipped where it shouldn't", ff4j.check(featureName));
waitSomeSeconds();
return this;
}
/**
* Check Feature Allowed.
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatCurrentUserIsAllowedOnFeature(String featureName) {
assertThatFeatureExist(featureName);
Assert.assertTrue(ff4j.isAllowed(ff4j.getFeature(featureName)));
waitSomeSeconds();
return this;
}
/**
* Check Feature Allowed.
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatCurrentUserIsNotAllowedOnFeature(String featureName) {
assertThatFeatureExist(featureName);
Assert.assertFalse(ff4j.isAllowed(ff4j.getFeature(featureName)));
waitSomeSeconds();
return this;
}
/**
* Check Number of features
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatStoreHasSize(int expectedNumber) {
Assert.assertEquals(expectedNumber, ff4j.getFeatureStore().readAll().size());
waitSomeSeconds();
return this;
}
/**
* Check Number of features
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatPropertyStoreHasSize(int expectedNumber) {
Assert.assertEquals(expectedNumber, ff4j.getPropertiesStore().listPropertyNames().size());
waitSomeSeconds();
return this;
}
/**
* Check Number of features
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatStoreHasNumberOfGroups(int expectedNumber) {
Assert.assertEquals(expectedNumber, ff4j.getFeatureStore().readAllGroups().size());
waitSomeSeconds();
return this;
}
/**
* Check that feature exists and have expected role.
*
* @param featureName
* target feature Name
* @param roleName
* target role name
* @return current object
*/
public final AssertFf4j assertThatFeatureHasRole(String featureName, String roleName) {
assertThatFeatureExist(featureName);
Assert.assertTrue("'" + featureName + "' has no roles",
!ff4j.getFeature(featureName).getPermissions().isEmpty());
Assert.assertTrue("'" + featureName + "' has not role '" + roleName + "'",
ff4j.getFeature(featureName).getPermissions().contains(roleName));
waitSomeSeconds();
return this;
}
/**
* Check that feature exists and does not have expected role.
*
* @param featureName
* target feature Name
* @param roleName
* target role name
* @return current object
*/
public final AssertFf4j assertThatFeatureHasNotRole(String featureName, String roleName) {
assertThatFeatureExist(featureName);
if (null != ff4j.getFeature(featureName).getPermissions()) {
Assert.assertFalse("Feature must no contain role " + roleName,
ff4j.getFeature(featureName).getPermissions().contains(roleName));
}
waitSomeSeconds();
return this;
}
/**
* Check that feature is in expected group.
*
* @param featureName
* target feature Name
* @param roleName
* target role name
* @return current object
*/
public final AssertFf4j assertThatFeatureIsInGroup(String featureName, String groupName) {
assertThatFeatureExist(featureName);
String group = ff4j.getFeature(featureName).getGroup();
Assert.assertTrue("'" + featureName + "' must be in group '" + groupName + "' but is in <" + group + ">",
group != null && groupName.equals(group));
waitSomeSeconds();
return this;
}
/**
* Check that feature is in expected group.
*
* @param featureName
* target feature Name
* @param roleName
* target role name
* @return current object
*/
public final AssertFf4j assertThatFeatureNotInGroup(String featureName, String groupName) {
assertThatFeatureExist(featureName);
String group = ff4j.getFeature(featureName).getGroup();
Assert.assertTrue(group == null || !groupName.equals(group));
waitSomeSeconds();
return this;
}
/**
* Chack that feature is enabled in current store.
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatFeatureIsEnabled(String featureName) {
assertThatFeatureExist(featureName);
Assert.assertTrue(ff4j.getFeatureStore().read(featureName).isEnable());
waitSomeSeconds();
return this;
}
/**
* Chack that feature is disabled in current store.
*
* @param featureName
* target featureName
* @return current object
*/
public final AssertFf4j assertThatFeatureIsDisabled(String featureName) {
assertThatFeatureExist(featureName);
Assert.assertFalse("'" + featureName + "' must be disabled",
ff4j.getFeatureStore().read(featureName).isEnable());
waitSomeSeconds();
return this;
}
/**
* Check Group Size
*
* @param expected
* expected value for size
* @param groupName
* target groupName
* @return current object
*/
public final AssertFf4j assertThatGroupExist(String groupName) {
Assert.assertTrue("Group '" + groupName + " ' does no exist", ff4j.getFeatureStore().existGroup(groupName));
waitSomeSeconds();
return this;
}
/**
* Check that group does not exist
*
* @param expected
* expected value for size
* @param groupName
* target groupName
* @return current object
*/
public AssertFf4j assertThatGroupDoesNotExist(String groupName) {
waitSomeSeconds();
Assert.assertFalse("Group '" + groupName + " ' does no exist", ff4j.getFeatureStore().existGroup(groupName));
return this;
}
/**
* Check Group Size
*
* @param expected
* expected value for size
* @param groupName
* target groupName
* @return current object
*/
public final AssertFf4j assertThatGroupHasSize(int expected, String groupName) {
assertThatGroupExist(groupName);
Assert.assertEquals(expected, ff4j.getFeatureStore().readGroup(groupName).size());
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureHasFlippingStrategy(String featureName) {
Assert.assertNotNull(FEATURE + featureName + "' must have a FlippingStrategy but doesn't",
ff4j.getFeature(featureName).getFlippingStrategy());
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureDoesNotHaveFlippingStrategy(String featureName) {
Assert.assertNull(FEATURE + featureName + "' must not have a flipping strategy",
ff4j.getFeature(featureName).getFlippingStrategy());
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureHasProperties(String featureName) {
assertThatFeatureExist(featureName);
Map<String, Property<?>> properties = ff4j.getFeature(featureName).getCustomProperties();
Assert.assertTrue("Properties are required", (properties != null) && (properties.size() > 0));
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureDoesNotHaveProperties(String featureName) {
assertThatFeatureExist(featureName);
Map<String, Property<?>> properties = ff4j.getFeature(featureName).getCustomProperties();
Assert.assertTrue("Properties are required", (properties == null) || properties.isEmpty());
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureHasProperty(String featureName, String propertyName) {
assertThatFeatureHasProperties(featureName);
Map<String, Property<?>> properties = ff4j.getFeature(featureName).getCustomProperties();
Assert.assertTrue("Feature must contain property " + propertyName, properties.containsKey(propertyName));
waitSomeSeconds();
return this;
}
/**
* Check existence of the traget feature
*
* @param featureName
* targte featurename
* @return current object
*/
public final AssertFf4j assertThatFeatureHasNotProperty(String featureName, String propertyName) {
assertThatFeatureExist(featureName);
Map<String, Property<?>> properties = ff4j.getFeature(featureName).getCustomProperties();
Assert.assertTrue("Feature must contain property " + propertyName,
(properties == null) || !properties.containsKey(propertyName));
waitSomeSeconds();
return this;
}
// Convenient methods
public void waitSomeSeconds() {
try {
TimeUnit.SECONDS.sleep(pause);
} catch (InterruptedException e) {
System.err.println("An error occurs when waiting" + e.getMessage());
}
}
}