package slacknotifications.testframework;
import jetbrains.buildServer.messages.Status;
import jetbrains.buildServer.serverSide.*;
import jetbrains.buildServer.serverSide.settings.ProjectSettingsManager;
import org.jdom.JDOMException;
import slacknotifications.SlackNotification;
import slacknotifications.SlackNotificationImpl;
import slacknotifications.teamcity.*;
import slacknotifications.teamcity.payload.SlackNotificationPayloadManager;
import slacknotifications.teamcity.payload.content.SlackNotificationPayloadContent;
import slacknotifications.teamcity.settings.SlackNotificationConfig;
import slacknotifications.teamcity.settings.SlackNotificationMainSettings;
import slacknotifications.teamcity.settings.SlackNotificationProjectSettings;
import slacknotifications.testframework.util.ConfigLoaderUtil;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Mockito.*;
public class SlackNotificationMockingFrameworkImpl implements SlackNotificationMockingFramework {
SlackNotificationPayloadContent content;
SlackNotificationConfig slackNotificationConfig;
SBuildServer sBuildServer = mock(SBuildServer.class);
BuildHistory buildHistory = mock(BuildHistory.class);
ProjectSettingsManager settings = mock(ProjectSettingsManager.class);
ProjectManager projectManager = mock(ProjectManager.class);
SlackNotificationMainSettings configSettings = mock(SlackNotificationMainSettings.class);
SlackNotificationPayloadManager manager = mock(SlackNotificationPayloadManager.class);
// SlackNotificationPayload payload = new SlackNotificationPayloadDetailed(manager);
SlackNotificationProjectSettings projSettings;
SlackNotificationFactory factory = mock(SlackNotificationFactory.class);
SlackNotification slacknotification = mock (SlackNotification.class);
SlackNotification slackNotificationImpl;
SlackNotification spySlackNotification;
SFinishedBuild previousSuccessfulBuild = mock(SFinishedBuild.class);
SFinishedBuild previousFailedBuild = mock(SFinishedBuild.class);
List<SFinishedBuild> finishedSuccessfulBuilds = new ArrayList<SFinishedBuild>();
List<SFinishedBuild> finishedFailedBuilds = new ArrayList<SFinishedBuild>();
SBuildType sBuildType = new MockSBuildType("Test Build", "A Test Build", "bt1");
SBuildType sBuildType02 = new MockSBuildType("Test Build-2", "A Test Build 02", "bt2");
SBuildType sBuildType03 = new MockSBuildType("Test Build-2", "A Test Build 03", "bt3");
SRunningBuild sRunningBuild = new MockSRunningBuild(sBuildType, "SubVersion", Status.NORMAL, "Running", "TestBuild01");
SProject sProject = new MockSProject("Test Project", "A test project", "project1", "ATestProject", sBuildType);
SProject sProject02 = new MockSProject("Test Project 02", "A test project 02", "project2", "TestProjectNumber02", sBuildType);
SProject sProject03 = new MockSProject("Test Project 03", "A test sub project 03", "project3", "TestProjectNumber02_TestProjectNumber03", sBuildType);
SBuildType build2 = mock(SBuildType.class);
SBuildType build3 = mock(SBuildType.class);
SlackNotificationListener whl;
BuildStateEnum buildstateEnum;
private SlackNotificationMockingFrameworkImpl() {
slackNotificationImpl = new SlackNotificationImpl();
spySlackNotification = spy(slackNotificationImpl);
whl = new SlackNotificationListener(sBuildServer, settings, configSettings, manager, factory);
projSettings = new SlackNotificationProjectSettings();
when(factory.getSlackNotification()).thenReturn(spySlackNotification);
//when(manager.isRegisteredFormat("JSON")).thenReturn(true);
// when(manager.getFormat("JSON")).thenReturn(payload);
//when(manager.getServer()).thenReturn(sBuildServer);
when(projectManager.findProjectById("project01")).thenReturn(sProject);
when(sBuildServer.getHistory()).thenReturn(buildHistory);
when(sBuildServer.getRootUrl()).thenReturn("http://test.server");
when(sBuildServer.getProjectManager()).thenReturn(projectManager);
when(previousSuccessfulBuild.getBuildStatus()).thenReturn(Status.NORMAL);
when(previousSuccessfulBuild.isPersonal()).thenReturn(false);
when(previousFailedBuild.getBuildStatus()).thenReturn(Status.FAILURE);
when(previousFailedBuild.isPersonal()).thenReturn(false);
finishedSuccessfulBuilds.add(previousSuccessfulBuild);
finishedFailedBuilds.add(previousFailedBuild);
((MockSBuildType) sBuildType).setProject(sProject);
when(settings.getSettings(sRunningBuild.getProjectId(), "slackNotifications")).thenReturn(projSettings);
when(build2.getBuildTypeId()).thenReturn("bt2");
when(build2.getInternalId()).thenReturn("bt2");
when(build2.getName()).thenReturn("This is Build 2");
when(build3.getBuildTypeId()).thenReturn("bt3");
when(build3.getInternalId()).thenReturn("bt3");
when(build3.getName()).thenReturn("This is Build 3");
((MockSProject) sProject).addANewBuildTypeToTheMock(build2);
((MockSProject) sProject).addANewBuildTypeToTheMock(build3);
((MockSProject) sProject02).addANewBuildTypeToTheMock(sBuildType02);
((MockSProject) sProject03).addANewBuildTypeToTheMock(sBuildType03);
((MockSProject) sProject03).setParentProject(sProject02);
((MockSProject) sProject02).addChildProjectToMock(sProject03);
whl.register();
}
public static SlackNotificationMockingFramework create(BuildStateEnum buildState) {
SlackNotificationMockingFrameworkImpl framework = new SlackNotificationMockingFrameworkImpl();
framework.buildstateEnum = buildState;
framework.content = new SlackNotificationPayloadContent(framework.sBuildServer, framework.sRunningBuild, framework.previousSuccessfulBuild, buildState);
return framework;
}
@Override
public SBuildServer getServer() {
return sBuildServer;
}
@Override
public SRunningBuild getRunningBuild() {
return sRunningBuild;
}
@Override
public SlackNotificationPayloadContent getSlackNotificationContent() {
return content;
}
@Override
public void loadSlackNotificationConfigXml(File xmlConfigFile) throws JDOMException, IOException {
slackNotificationConfig = ConfigLoaderUtil.getFirstSlackNotificationInConfig(xmlConfigFile);
this.content = new SlackNotificationPayloadContent(this.sBuildServer, this.sRunningBuild, this.previousSuccessfulBuild, this.buildstateEnum);
}
@Override
public void loadSlackNotificationProjectSettingsFromConfigXml(File xmlConfigFile) throws IOException, JDOMException{
projSettings.readFrom(ConfigLoaderUtil.getFullConfigElement(xmlConfigFile).getChild("slackNotifications"));
}
@Override
public SlackNotificationConfig getSlackNotificationConfig() {
return slackNotificationConfig;
}
@Override
public SlackNotificationProjectSettings getSlackNotificationProjectSettings() {
return projSettings;
}
@Override
public SlackNotificationPayloadManager getSlackNotificationPayloadManager() {
return manager;
}
@Override
public SBuildType getSBuildType() {
return sBuildType;
}
@Override
public SBuildType getSBuildTypeFromSubProject() {
return sBuildType03;
}
}