package org.ff4j.services;
import org.apache.commons.lang3.StringUtils;
import org.ff4j.FF4j;
import org.ff4j.core.Feature;
import org.ff4j.property.*;
import org.ff4j.property.store.InMemoryPropertyStore;
import org.ff4j.property.util.PropertyFactory;
import org.ff4j.services.model.FeatureActions;
import org.ff4j.store.InMemoryFeatureStore;
import org.skyscreamer.jsonassert.JSONAssert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import static org.ff4j.services.utils.JsonUtils.GSON;
/*
* #%L
* ff4j-spring-services
* %%
* Copyright (C) 2013 - 2016 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%
*/
/**
* @author <a href="mailto:paul58914080@gmail.com">Paul Williams</a>
*/
@ContextConfiguration(classes = {CucumberConfiguration.class})
public class AbstractStepDef {
@Autowired
protected FF4j ff4j;
protected Throwable exception;
protected Object actualResponse;
protected void createFeatures(List<FeaturePojo> features) {
for (FeaturePojo featurePojo : features) {
Feature feature = new Feature(featurePojo.getUid(), Boolean.valueOf(featurePojo.getEnable()),
featurePojo.getDescription(), featurePojo.getGroup(),
Arrays.asList(featurePojo.getPermissions().split(",")));
createFeature(feature);
}
}
protected void createProperties(List<PropertyPojo> properties) {
for (PropertyPojo propertyPojo : properties) {
Property<?> property = asProperty(propertyPojo.getName(), propertyPojo.getType(), propertyPojo.getValue(),
propertyPojo.getDescription(),
StringUtils.isNotBlank(propertyPojo.getFixedValueCSV()) ? new HashSet<String>(Arrays.asList(propertyPojo.getFixedValueCSV().split(","))) : null);
createProperty(property);
}
}
private void createProperty(Property<?> property) {
ff4j.createProperty(property);
}
protected void createFeature(Feature feature) {
ff4j.createFeature(feature);
}
protected void clearFeatureStore() {
ff4j.setPropertiesStore(new InMemoryPropertyStore());
ff4j.setFeatureStore(new InMemoryFeatureStore());
}
protected void clearPropertyStore() {
ff4j.setPropertiesStore(new InMemoryPropertyStore());
ff4j.setFeatureStore(new InMemoryFeatureStore());
}
protected Property<?> asProperty(String name, String type, String value, String description, Set<String> fixedValues) {
return PropertyFactory.createProperty(name, getType(type), value, description, fixedValues);
}
protected void assertException(String className) throws ClassNotFoundException {
assertThat(exception).isInstanceOf(Class.forName(className));
}
protected void assertUpdated() {
assertThat(actualResponse).isEqualTo(FeatureActions.UPDATED);
}
protected void assertCreated() {
assertThat(actualResponse).isEqualTo(FeatureActions.CREATED);
}
protected void assertStrictResponse(String expectedResponse) {
JSONAssert.assertEquals(expectedResponse, GSON.toJson(actualResponse), true);
}
protected void assertFalse() {
assertThat(Boolean.parseBoolean(actualResponse.toString())).isFalse();
}
protected void assertTrue() {
assertThat(Boolean.parseBoolean(actualResponse.toString())).isTrue();
}
protected void assertLenientResponse(String expectedResponse) {
JSONAssert.assertEquals(expectedResponse, GSON.toJson(actualResponse), false);
}
private String getType(String name) {
PropertyValueEnum propertyEnum = PropertyValueEnum.getEnum(name);
switch (propertyEnum) {
case INT:
case LONG:
case STRING:
case BOOLEAN:
return propertyEnum.getType();
default:
return null;
}
}
private enum PropertyValueEnum {
INT("int", PropertyInt.class.getName()),
LONG("long", PropertyLong.class.getName()),
STRING("string", PropertyString.class.getName()),
BOOLEAN("boolean", PropertyBoolean.class.getName());
private String name;
private String type;
public String getName() {
return name;
}
public String getType() {
return type;
}
PropertyValueEnum(String name, String type) {
this.name = name;
this.type = type;
}
public static PropertyValueEnum getEnum(String name) {
for (PropertyValueEnum propertyValueEnum : PropertyValueEnum.values()) {
if (StringUtils.isNotBlank(name) && name.equalsIgnoreCase(propertyValueEnum.getName())) {
return propertyValueEnum;
}
}
throw new UnsupportedOperationException("property " + name + " not found");
}
}
protected class FeaturePojo {
private String uid;
private String enable;
private String description;
private String group;
private String permissions;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getEnable() {
return enable;
}
public void setEnable(String enable) {
this.enable = enable;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
public String getPermissions() {
return permissions;
}
public void setPermissions(String permissions) {
this.permissions = permissions;
}
}
protected class PropertyPojo {
private String name;
private String description;
private String type;
private String value;
private String fixedValueCSV;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getFixedValueCSV() {
return fixedValueCSV;
}
public void setFixedValueCSV(String fixedValueCSV) {
this.fixedValueCSV = fixedValueCSV;
}
}
}