From 5a55c36222a68c4931af334462cfeab1d5c68239 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 24 Jan 2019 14:46:42 +0100
Subject: [PATCH] no-jira: add a fake smtp server for unit tests and selenium
 tests

---
 pom.xml                                       |  6 +++
 .../util/mail/manager/MailManagerImpl.java    |  5 +--
 .../util/mail/manager/MailManagerTest.java    | 22 +++++++++-
 .../java/org/olat/selenium/CourseTest.java    |  1 -
 .../java/org/olat/selenium/Deployments.java   | 40 ++++++++++++++++++-
 .../org/olat/selenium/PortfolioV2Test.java    | 14 ++++++-
 .../page/portfolio/BinderPublicationPage.java |  3 --
 src/test/java/org/olat/test/OlatTestCase.java | 24 ++++++++++-
 8 files changed, 103 insertions(+), 12 deletions(-)

diff --git a/pom.xml b/pom.xml
index 7ce0c44f59d..d6a247b64fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2492,6 +2492,12 @@
 			<version>0.5.2</version>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>com.github.kirviq</groupId>
+			<artifactId>dumbster</artifactId>
+			<version>1.7.1</version>
+			<scope>test</scope>
+		</dependency>
     
 		<!-- Start test dependencies for Arquillian and Selenium -->
 		<dependency>
diff --git a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
index 39631adcfa7..cd5f22a5d08 100644
--- a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
+++ b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
@@ -1782,9 +1782,8 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 		}
 
 		try{
-			if(Settings.isJUnitTest()) {
-				//we want not send really e-mails
-			} else if (mailModule.isMailHostEnabled() && result.getReturnCode() == MailerResult.OK) {
+			System.out.println("mailModule isMailHostEnabled: " + mailModule.isMailHostEnabled() + " " + WebappHelper.getMailConfig("mailhost"));
+			if (mailModule.isMailHostEnabled() && result.getReturnCode() == MailerResult.OK) {
 				// now send the mail
 				if(Settings.isDebuging()) {
 					logMessage(msg);
diff --git a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
index 49ac55841d6..05e7caab87a 100644
--- a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
+++ b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java
@@ -54,6 +54,8 @@ import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import com.dumbster.smtp.SmtpMessage;
+
 /**
  * 
  * Initial date: 30.11.2012<br>
@@ -266,7 +268,7 @@ public class MailManagerTest extends OlatTestCase {
 		
 		// sleep until threads should have terminated/excepted
 		try {
-			Thread.sleep(30000);// eat all JMS events
+			sleep(30000);// eat all JMS events
 			finishCount.await(120, TimeUnit.SECONDS);
 		} catch (InterruptedException e) {
 			log.error("", e);
@@ -276,6 +278,24 @@ public class MailManagerTest extends OlatTestCase {
 		assertTrue("It throws an exception in test", exceptionHolder.isEmpty());	
 		assertEquals("Thread(s) did not finish", NUM_OF_THREADS, statusList.size());
 	}
+	
+	@Test
+	public void sendExternMessage() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("mailman-1");
+		
+		MailBundle bundle = new MailBundle();
+		bundle.setToId(id);
+		bundle.setContent("Hello", "Hello world");
+		
+		MailerResult result = new MailerResult();
+		mailManager.sendExternMessage(bundle, result, false);
+		
+		List<SmtpMessage> messages = getSmtpServer().getReceivedEmails();
+		Assert.assertFalse(messages.isEmpty());
+		
+		SmtpMessage message = messages.get(0);
+		Assert.assertEquals(id.getUser().getEmail(), message.getHeaderValue("To"));
+	}
 
 	@Test
 	public void testFromHeaderOverride() throws MessagingException {
diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java
index 0d29797c951..73adb855d5e 100644
--- a/src/test/java/org/olat/selenium/CourseTest.java
+++ b/src/test/java/org/olat/selenium/CourseTest.java
@@ -250,7 +250,6 @@ public class CourseTest extends Deployments {
 		//from description editor, back to details and launch the course
 		settings
 			.assertOnInfos();
-		OOGraphene.closeErrorBox(browser);//close mail error
 		settings	
 			.back();
 		
diff --git a/src/test/java/org/olat/selenium/Deployments.java b/src/test/java/org/olat/selenium/Deployments.java
index a5116a41f67..f8f41cb1258 100644
--- a/src/test/java/org/olat/selenium/Deployments.java
+++ b/src/test/java/org/olat/selenium/Deployments.java
@@ -19,11 +19,20 @@
  */
 package org.olat.selenium;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.eu.ingwar.tools.arquillian.extension.suite.annotations.ArquillianSuiteDeployment;
 import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.After;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.test.ArquillianDeployments;
 
+import com.dumbster.smtp.SimpleSmtpServer;
+
 /**
  * 
  * Initial date: 12 nov. 2017<br>
@@ -33,9 +42,36 @@ import org.olat.test.ArquillianDeployments;
 @ArquillianSuiteDeployment
 public class Deployments {
 	
+	private static final OLog log = Tracing.createLoggerFor(Deployments.class);
+
+	private static SimpleSmtpServer dumbster;
+	static {
+		try {
+			dumbster = SimpleSmtpServer.start(SimpleSmtpServer.AUTO_SMTP_PORT);
+		} catch (IOException e) {
+			log.error("", e);
+		}
+	}
+	
 	@Deployment(testable = false)
 	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
+		Map<String,String> mailSettings = new HashMap<>();
+		if(dumbster != null) {
+			mailSettings.put("smtp.port", String.valueOf(dumbster.getPort()));
+			mailSettings.put("smtp.host", "localhost");
+			log.info("Simple smtp server started on port: " + dumbster.getPort());
+		}
+		return ArquillianDeployments.createDeployment(mailSettings);
+	}
+	
+	@After
+	public void afterTest() {
+		if(dumbster != null) {
+			dumbster.reset();
+		}
+	}
+	
+	protected SimpleSmtpServer getSmtpServer() {
+		return dumbster;
 	}
-
 }
diff --git a/src/test/java/org/olat/selenium/PortfolioV2Test.java b/src/test/java/org/olat/selenium/PortfolioV2Test.java
index c67831c8e18..88e9f8d7cdf 100644
--- a/src/test/java/org/olat/selenium/PortfolioV2Test.java
+++ b/src/test/java/org/olat/selenium/PortfolioV2Test.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.List;
 import java.util.UUID;
 
 import org.jboss.arquillian.container.test.api.RunAsClient;
@@ -31,6 +32,7 @@ import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.olat.selenium.page.LoginPage;
@@ -62,6 +64,8 @@ import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
 import org.openqa.selenium.WebDriver;
 
+import com.dumbster.smtp.SmtpMessage;
+
 /**
  * 
  * Suite of test for the e-Portfolio version 2.0
@@ -565,10 +569,11 @@ public class PortfolioV2Test extends Deployments {
 			.createEntry("3. Page", 1)
 			.assertOnPage("3. Page");
 		
+		String invitation = "c.l." + UUID.randomUUID() + "@frentix.com";
 		BinderPublicationPage binderPublish = binder
 			.selectPublish()
 			.openAccessMenu()
-			.addInvitation("c.l." + UUID.randomUUID() + "@frentix.com")
+			.addInvitation(invitation)
 			.fillInvitation("Clara", "Vigne")
 			.fillAccessRights("3. Page", Boolean.TRUE);
 		String url = binderPublish.getInvitationURL();
@@ -595,6 +600,13 @@ public class PortfolioV2Test extends Deployments {
 			.assertOnPageInEntries("3. Page")
 			.selectEntryInEntries("3. Page")
 			.assertOnPage("3. Page");
+		
+		// check mail really send
+		List<SmtpMessage> emails = getSmtpServer().getReceivedEmails();
+		Assert.assertNotNull(emails);
+		Assert.assertEquals(1, emails.size());
+		SmtpMessage email = emails.get(0);
+		Assert.assertEquals(invitation + ":;", email.getHeaderValue("To"));
 	}
 	
 
diff --git a/src/test/java/org/olat/selenium/page/portfolio/BinderPublicationPage.java b/src/test/java/org/olat/selenium/page/portfolio/BinderPublicationPage.java
index e4701077c50..acf65dec89e 100644
--- a/src/test/java/org/olat/selenium/page/portfolio/BinderPublicationPage.java
+++ b/src/test/java/org/olat/selenium/page/portfolio/BinderPublicationPage.java
@@ -101,9 +101,6 @@ public class BinderPublicationPage {
 		By submitBy = By.cssSelector(".o_sel_pf_invitation_button_group button.btn-primary");
 		browser.findElement(submitBy).click();
 		OOGraphene.waitBusy(browser);
-		
-		//close error smtp
-		OOGraphene.closeErrorBox(browser);
 		return this;
 	}
 }
diff --git a/src/test/java/org/olat/test/OlatTestCase.java b/src/test/java/org/olat/test/OlatTestCase.java
index 2b1e249e743..390f23d1210 100644
--- a/src/test/java/org/olat/test/OlatTestCase.java
+++ b/src/test/java/org/olat/test/OlatTestCase.java
@@ -42,12 +42,15 @@ import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.helpers.Settings;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.WebappHelper;
 import org.olat.core.util.event.FrameworkStartupEventChannel;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
 
+import com.dumbster.smtp.SimpleSmtpServer;
+
 /**
  * Initial Date:  25.10.2002
  *
@@ -66,6 +69,8 @@ public abstract class OlatTestCase extends AbstractJUnit4SpringContextTests {
 	private static boolean oracleConfigured = false;
 	private static boolean started = false;
 	
+	private SimpleSmtpServer dumbster;
+	
 	 @Rule public TestName currentTestName = new TestName();
 	
 	/**
@@ -91,6 +96,15 @@ public abstract class OlatTestCase extends AbstractJUnit4SpringContextTests {
 			return;
 		}
 		
+		try {
+			dumbster = SimpleSmtpServer.start(SimpleSmtpServer.AUTO_SMTP_PORT);
+			log.info("Simple smtp server started on port: " + dumbster.getPort());
+			WebappHelper.setMailConfig("mailport", String.valueOf(dumbster.getPort()));
+			WebappHelper.setMailConfig("mailhost", "localhost");
+		} catch (IOException e) {
+			log.error("", e);
+		}
+		
 		FrameworkStartupEventChannel.fireEvent();
 		
 		String dbVendor = DBFactory.getInstance().getDbVendor();
@@ -120,6 +134,10 @@ public abstract class OlatTestCase extends AbstractJUnit4SpringContextTests {
 				e1.printStackTrace();
 			}
 		}
+		
+		if(dumbster != null) {
+			dumbster.reset();
+		}
 	}
 	
 	@SuppressWarnings("unchecked")
@@ -159,7 +177,7 @@ public abstract class OlatTestCase extends AbstractJUnit4SpringContextTests {
 							result.set(false);
 						}
 						DBFactory.getInstance().commitAndCloseSession();
-						Thread.sleep(100);
+						sleep(100);
 					}
 				} catch (Exception e) {
 					log.error("", e);
@@ -186,6 +204,10 @@ public abstract class OlatTestCase extends AbstractJUnit4SpringContextTests {
 			e.printStackTrace();
 		}
 	}
+	
+	protected SimpleSmtpServer getSmtpServer() {
+		return dumbster;
+	}
 
 	/**
 	 * @return True if the test run on PostreSQL
-- 
GitLab