package org.jboss.tools.deltaspike.ui.bot.test;
import static org.junit.Assert.fail;
import org.eclipse.swt.SWT;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerRequirement;
import org.jboss.reddeer.common.exception.WaitTimeoutExpiredException;
import org.jboss.reddeer.common.matcher.RegexMatcher;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.common.wait.WaitWhile;
import org.jboss.reddeer.core.condition.ShellWithTextIsAvailable;
import org.jboss.reddeer.core.handler.WidgetHandler;
import org.jboss.reddeer.eclipse.condition.ProblemExists;
import org.jboss.reddeer.eclipse.ui.problems.ProblemsView.ProblemType;
import org.jboss.reddeer.junit.requirement.inject.InjectRequirement;
import org.jboss.reddeer.swt.impl.button.PushButton;
import org.jboss.reddeer.swt.impl.combo.LabeledCombo;
import org.jboss.reddeer.swt.impl.label.DefaultLabel;
import org.jboss.reddeer.swt.impl.shell.DefaultShell;
import org.jboss.reddeer.workbench.ui.dialogs.WorkbenchPreferenceDialog;
import org.jboss.tools.cdi.reddeer.cdi.ui.CDIValidatorPreferencePage;
import org.jboss.tools.deltaspike.ui.bot.test.condition.SpecificProblemExists;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Test;
/**
* Tests if there are all deltaspike validation messages under CDI Validator and
* whether their severity can be changed.
*
* @author jjankovi
*
*/
public class ValidationsInPreferenceTest extends DeltaspikeTestBase {
@InjectRequirement
private static ServerRequirement sr;
private static WorkbenchPreferenceDialog preferenceDialog;
@After
public void closeAllEditors() {
deleteAllProjects();
}
@AfterClass
public static void setDefaultProblemSeverity() {
setSeverityToDefault();
}
/**
* Tests if there are all deltaspike validation messages under CDI Validator.
*/
@Test
public void testAllValidationsPresence() {
openValidationsInPreferenceDialog();
checkDeltaspikeValidationPresense();
preferenceDialog.cancel();
}
/**
* Test if problem severity can be changed.
*/
@Test
public void testConfigureProblemSeverity() {
importDeltaspikeProject("configureProblemSeverity", sr);
setSeverityToAll("Error");
checkAllProblemsDetected(ProblemType.ERROR);
setSeverityToAll("Warning");
checkAllProblemsDetected(ProblemType.WARNING);
setSeverityToAll("Ignore");
// Check there is no problems
try {
new WaitWhile(new ProblemExists(ProblemType.ANY), TimePeriod.LONG);
} catch (WaitTimeoutExpiredException e) {
fail(e.getMessage());
}
}
private static void openValidationsInPreferenceDialog() {
preferenceDialog = new WorkbenchPreferenceDialog();
preferenceDialog.open();
preferenceDialog.select(new CDIValidatorPreferencePage());
WidgetHandler.getInstance().notify(SWT.MouseUp, new DefaultLabel("Extensions").getSWTWidget());
WidgetHandler.getInstance().notify(SWT.MouseUp, new DefaultLabel("Deltaspike").getSWTWidget());
}
private void checkDeltaspikeValidationPresense() {
for (DeltaspikeValidations validation : DeltaspikeValidations.values()) {
new DefaultLabel(validation.getValidationLabel());
}
}
private void setSeverityToAll(String severity) {
openValidationsInPreferenceDialog();
for (DeltaspikeValidations validation : DeltaspikeValidations.values()) {
new LabeledCombo(validation.getValidationLabel()).setSelection(severity);
}
applyChanges();
}
private static void setSeverityToDefault() {
openValidationsInPreferenceDialog();
for (DeltaspikeValidations validation : DeltaspikeValidations.values()) {
new LabeledCombo(validation.getValidationLabel()).setSelection(validation.getDefaultProblemSeverity());
}
applyChanges();
}
private void checkAllProblemsDetected(ProblemType problemType) {
for (DeltaspikeValidations validation : DeltaspikeValidations.values()) {
try {
new WaitUntil(
new SpecificProblemExists(new RegexMatcher(validation.getValidationMessage()), problemType),
TimePeriod.LONG);
} catch (WaitTimeoutExpiredException e) {
fail(e.getMessage());
}
}
}
private static void applyChanges() {
String confirmChangesShell = "Validator Settings Changed";
new PushButton("Apply").click();
new WaitUntil(new ShellWithTextIsAvailable(confirmChangesShell));
new DefaultShell(confirmChangesShell);
new PushButton("Yes").click();
new WaitWhile(new ShellWithTextIsAvailable(confirmChangesShell));
preferenceDialog.ok();
}
}
enum DeltaspikeValidations {
// @formatter:off
EXCEPTION_HANDLER(
"Bean is not annotated @ExceptionHandler:",
"Exception handler methods must be registered on beans annotated with @ExceptionHandler",
"Warning"),
INVALID_HANDER(
"Invalid hander method parameter type:",
"Parameter of a handler method must be a ExceptionEvent.*",
"Warning"),
AMBIGUOUS_AUTHORIZER(
"Ambiguous authorizer for a secured method:",
"Ambiguous authorizers found.*",
"Warning"),
UNRESOLVED_AUTHORIZER(
"Unresolved authorizer for a secured method:",
"No matching authorizer found.*",
"Warning"),
INVALID_AUTHORIZER(
"Invalid authorizer:",
"Authorizer method .*",
"Error");
// @formatter:on
private String label;
private String message;
private String severity;
private DeltaspikeValidations(String label, String message, String severity) {
this.label = label;
this.message = message;
this.severity = severity;
}
/**
* Returns text which should be used in CDIValidatorPreferencePage
*
* @return label used in preference page
*/
public String getValidationLabel() {
return label;
}
/**
* Returns validation message which should be displayed in java editor
*
* @return validation message text
*/
public String getValidationMessage() {
return message;
}
/**
* Returns default problem severity as string.
*
* @return default problem severity
*/
public String getDefaultProblemSeverity() {
return severity;
}
}