001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.mail; 018 019 import java.io.File; 020 import java.io.IOException; 021 import java.net.URL; 022 023 import javax.activation.FileDataSource; 024 025 import org.apache.commons.mail.mocks.MockHtmlEmailConcrete; 026 import org.apache.commons.mail.settings.EmailConfiguration; 027 028 /** 029 * JUnit test case for HtmlEmail Class 030 * 031 * @since 1.0 032 * @author <a href="mailto:corey.scott@gmail.com">Corey Scott</a> 033 * @version $Id: HtmlEmailTest.java 545815 2007-06-09 23:46:00Z bspeakmon $ 034 */ 035 036 public class HtmlEmailTest extends BaseEmailTestCase 037 { 038 /** */ 039 private MockHtmlEmailConcrete email; 040 041 /** 042 * @param name name 043 */ 044 public HtmlEmailTest(String name) 045 { 046 super(name); 047 } 048 049 /** 050 * @throws Exception */ 051 protected void setUp() throws Exception 052 { 053 super.setUp(); 054 // reusable objects to be used across multiple tests 055 this.email = new MockHtmlEmailConcrete(); 056 } 057 058 /** 059 * @throws EmailException */ 060 public void testGetSetTextMsg() throws EmailException 061 { 062 // ==================================================================== 063 // Test Success 064 // ==================================================================== 065 for (int i = 0; i < testCharsValid.length; i++) 066 { 067 this.email.setTextMsg(testCharsValid[i]); 068 assertEquals(testCharsValid[i], this.email.getTextMsg()); 069 } 070 071 // ==================================================================== 072 // Test Exception 073 // ==================================================================== 074 for (int i = 0; i < this.testCharsNotValid.length; i++) 075 { 076 try 077 { 078 this.email.setTextMsg(this.testCharsNotValid[i]); 079 fail("Should have thrown an exception"); 080 } 081 catch (EmailException e) 082 { 083 assertTrue(true); 084 } 085 } 086 087 } 088 089 /** 090 * @throws EmailException if setting the message fails 091 */ 092 public void testGetSetHtmlMsg() throws EmailException 093 { 094 // ==================================================================== 095 // Test Success 096 // ==================================================================== 097 for (int i = 0; i < testCharsValid.length; i++) 098 { 099 this.email.setHtmlMsg(testCharsValid[i]); 100 assertEquals(testCharsValid[i], this.email.getHtmlMsg()); 101 } 102 103 // ==================================================================== 104 // Test Exception 105 // ==================================================================== 106 for (int i = 0; i < this.testCharsNotValid.length; i++) 107 { 108 try 109 { 110 this.email.setHtmlMsg(this.testCharsNotValid[i]); 111 fail("Should have thrown an exception"); 112 } 113 catch (EmailException e) 114 { 115 assertTrue(true); 116 } 117 } 118 119 } 120 121 /** 122 * @throws EmailException */ 123 public void testGetSetMsg() throws EmailException 124 { 125 // ==================================================================== 126 // Test Success 127 // ==================================================================== 128 for (int i = 0; i < testCharsValid.length; i++) 129 { 130 this.email.setMsg(testCharsValid[i]); 131 assertEquals(testCharsValid[i], this.email.getTextMsg()); 132 133 assertTrue( 134 this.email.getHtmlMsg().indexOf(testCharsValid[i]) != -1); 135 } 136 137 // ==================================================================== 138 // Test Exception 139 // ==================================================================== 140 for (int i = 0; i < this.testCharsNotValid.length; i++) 141 { 142 try 143 { 144 this.email.setMsg(this.testCharsNotValid[i]); 145 fail("Should have thrown an exception"); 146 } 147 catch (EmailException e) 148 { 149 assertTrue(true); 150 } 151 } 152 153 } 154 155 /** 156 * 157 * @throws Exception Exception 158 */ 159 public void testEmbedUrl() throws Exception 160 { 161 // ==================================================================== 162 // Test Success 163 // ==================================================================== 164 165 String strEmbed = 166 this.email.embed(new URL(this.strTestURL), "Test name"); 167 assertNotNull(strEmbed); 168 assertEquals(HtmlEmail.CID_LENGTH, strEmbed.length()); 169 170 // if we embed the same name again, do we get the same content ID 171 // back? 172 String testCid = 173 this.email.embed(new URL(this.strTestURL), "Test name"); 174 assertEquals(strEmbed, testCid); 175 176 // if we embed the same URL under a different name, is the content ID 177 // unique? 178 String newCid = 179 this.email.embed(new URL(this.strTestURL), "Test name 2"); 180 assertFalse(strEmbed.equals(newCid)); 181 182 // ==================================================================== 183 // Test Exceptions 184 // ==================================================================== 185 186 // Does an invalid URL throw an exception? 187 try 188 { 189 this.email.embed(new URL("http://bad.url"), "Bad URL"); 190 fail("Should have thrown an exception"); 191 } 192 catch (EmailException e) 193 { 194 // expected 195 } 196 197 // if we try to embed a different URL under a previously used name, 198 // does it complain? 199 try 200 { 201 this.email.embed(new URL("http://www.google.com"), "Test name"); 202 fail("shouldn't be able to use an existing name with a different URL!"); 203 } 204 catch (EmailException e) 205 { 206 // expected 207 } 208 } 209 210 public void testEmbedFile() throws Exception 211 { 212 // ==================================================================== 213 // Test Success 214 // ==================================================================== 215 216 File file = File.createTempFile("testEmbedFile", "txt"); 217 file.deleteOnExit(); 218 String strEmbed = this.email.embed(file); 219 assertNotNull(strEmbed); 220 assertEquals("generated CID has wrong length", 221 HtmlEmail.CID_LENGTH, strEmbed.length()); 222 223 // if we embed the same file again, do we get the same content ID 224 // back? 225 String testCid = 226 this.email.embed(file); 227 assertEquals("didn't get same CID after embedding same file twice", 228 strEmbed, testCid); 229 230 // if we embed a new file, is the content ID unique? 231 File otherFile = File.createTempFile("testEmbedFile2", "txt"); 232 otherFile.deleteOnExit(); 233 String newCid = this.email.embed(otherFile); 234 assertFalse("didn't get unique CID from embedding new file", 235 strEmbed.equals(newCid)); 236 } 237 238 public void testEmbedUrlAndFile() throws Exception 239 { 240 File tmpFile = File.createTempFile("testfile", "txt"); 241 tmpFile.deleteOnExit(); 242 String fileCid = this.email.embed(tmpFile); 243 244 URL fileUrl = tmpFile.toURL(); 245 String urlCid = this.email.embed(fileUrl, "urlName"); 246 247 assertFalse("file and URL cids should be different even for same resource", 248 fileCid.equals(urlCid)); 249 } 250 251 public void testEmbedDataSource() throws Exception 252 { 253 File tmpFile = File.createTempFile("testEmbedDataSource", "txt"); 254 tmpFile.deleteOnExit(); 255 FileDataSource dataSource = new FileDataSource(tmpFile); 256 257 // does embedding a datasource without a name fail? 258 try 259 { 260 this.email.embed(dataSource, ""); 261 fail("embedding with an empty string for a name should fail"); 262 } 263 catch (EmailException e) 264 { 265 // expected 266 } 267 268 // properly embed the datasource 269 String cid = this.email.embed(dataSource, "testname"); 270 271 // does embedding the same datasource under the same name return 272 // the original cid? 273 String sameCid = this.email.embed(dataSource, "testname"); 274 assertEquals("didn't get same CID for embedding same datasource twice", 275 cid, sameCid); 276 277 // does embedding another datasource under the same name fail? 278 File anotherFile = File.createTempFile("testEmbedDataSource2", "txt"); 279 anotherFile.deleteOnExit(); 280 FileDataSource anotherDS = new FileDataSource(anotherFile); 281 try 282 { 283 this.email.embed(anotherDS, "testname"); 284 } 285 catch (EmailException e) 286 { 287 // expected 288 } 289 } 290 291 /** 292 * @throws EmailException when bad addresses and attachments are used 293 * @throws IOException if creating a temp file, URL or sending fails 294 */ 295 public void testSend() throws EmailException, IOException 296 { 297 EmailAttachment attachment = new EmailAttachment(); 298 File testFile = null; 299 300 /** File to used to test file attachments (Must be valid) */ 301 testFile = File.createTempFile("commons-email-testfile", ".txt"); 302 testFile.deleteOnExit(); 303 304 // ==================================================================== 305 // Test Success 306 // ==================================================================== 307 this.getMailServer(); 308 309 String strSubject = "Test HTML Send #1 Subject (w charset)"; 310 311 this.email = new MockHtmlEmailConcrete(); 312 this.email.setHostName(this.strTestMailServer); 313 this.email.setSmtpPort(this.getMailServerPort()); 314 this.email.setFrom(this.strTestMailFrom); 315 this.email.addTo(this.strTestMailTo); 316 317 /** File to used to test file attachmetns (Must be valid) */ 318 attachment.setName("Test Attachment"); 319 attachment.setDescription("Test Attachment Desc"); 320 attachment.setPath(testFile.getAbsolutePath()); 321 this.email.attach(attachment); 322 323 this.email.setAuthentication(this.strTestUser, this.strTestPasswd); 324 325 this.email.setCharset(Email.ISO_8859_1); 326 this.email.setSubject(strSubject); 327 328 URL url = new URL(EmailConfiguration.TEST_URL); 329 String cid = this.email.embed(url, "Apache Logo"); 330 331 String strHtmlMsg = 332 "<html>The Apache logo - <img src=\"cid:" + cid + "\"><html>"; 333 334 this.email.setHtmlMsg(strHtmlMsg); 335 this.email.setTextMsg( 336 "Your email client does not support HTML emails"); 337 338 this.email.send(); 339 this.fakeMailServer.stop(); 340 // validate txt message 341 validateSend( 342 this.fakeMailServer, 343 strSubject, 344 this.email.getTextMsg(), 345 this.email.getFromAddress(), 346 this.email.getToList(), 347 this.email.getCcList(), 348 this.email.getBccList(), 349 true); 350 351 // validate html message 352 validateSend( 353 this.fakeMailServer, 354 strSubject, 355 this.email.getHtmlMsg(), 356 this.email.getFromAddress(), 357 this.email.getToList(), 358 this.email.getCcList(), 359 this.email.getBccList(), 360 false); 361 362 // validate attachment 363 validateSend( 364 this.fakeMailServer, 365 strSubject, 366 attachment.getName(), 367 this.email.getFromAddress(), 368 this.email.getToList(), 369 this.email.getCcList(), 370 this.email.getBccList(), 371 false); 372 373 this.getMailServer(); 374 375 this.email = new MockHtmlEmailConcrete(); 376 this.email.setHostName(this.strTestMailServer); 377 this.email.setSmtpPort(this.getMailServerPort()); 378 this.email.setFrom(this.strTestMailFrom); 379 this.email.addTo(this.strTestMailTo); 380 381 if (this.strTestUser != null && this.strTestPasswd != null) 382 { 383 this.email.setAuthentication( 384 this.strTestUser, 385 this.strTestPasswd); 386 } 387 388 strSubject = "Test HTML Send #1 Subject (wo charset)"; 389 this.email.setSubject(strSubject); 390 this.email.setTextMsg("Test message"); 391 392 this.email.send(); 393 this.fakeMailServer.stop(); 394 // validate txt message 395 validateSend( 396 this.fakeMailServer, 397 strSubject, 398 this.email.getTextMsg(), 399 this.email.getFromAddress(), 400 this.email.getToList(), 401 this.email.getCcList(), 402 this.email.getBccList(), 403 true); 404 } 405 406 /** 407 * 408 * @throws Exception Exception 409 */ 410 public void testSend2() throws Exception 411 { 412 // ==================================================================== 413 // Test Success 414 // ==================================================================== 415 416 this.getMailServer(); 417 418 this.email = new MockHtmlEmailConcrete(); 419 this.email.setHostName(this.strTestMailServer); 420 this.email.setSmtpPort(this.getMailServerPort()); 421 this.email.setFrom(this.strTestMailFrom); 422 this.email.addTo(this.strTestMailTo); 423 424 if (this.strTestUser != null && this.strTestPasswd != null) 425 { 426 this.email.setAuthentication( 427 this.strTestUser, 428 this.strTestPasswd); 429 } 430 431 String strSubject = "Test HTML Send #2 Subject (wo charset)"; 432 this.email.setSubject(strSubject); 433 this.email.setMsg("Test txt msg"); 434 435 this.email.send(); 436 this.fakeMailServer.stop(); 437 // validate txt message 438 validateSend( 439 this.fakeMailServer, 440 strSubject, 441 this.email.getTextMsg(), 442 this.email.getFromAddress(), 443 this.email.getToList(), 444 this.email.getCcList(), 445 this.email.getBccList(), 446 true); 447 448 // validate html message 449 validateSend( 450 this.fakeMailServer, 451 strSubject, 452 this.email.getHtmlMsg(), 453 this.email.getFromAddress(), 454 this.email.getToList(), 455 this.email.getCcList(), 456 this.email.getBccList(), 457 false); 458 459 this.getMailServer(); 460 461 this.email = new MockHtmlEmailConcrete(); 462 this.email.setHostName(this.strTestMailServer); 463 this.email.setFrom(this.strTestMailFrom); 464 this.email.setSmtpPort(this.getMailServerPort()); 465 this.email.addTo(this.strTestMailTo); 466 467 if (this.strTestUser != null && this.strTestPasswd != null) 468 { 469 this.email.setAuthentication( 470 this.strTestUser, 471 this.strTestPasswd); 472 } 473 474 strSubject = "Test HTML Send #2 Subject (w charset)"; 475 this.email.setCharset(Email.ISO_8859_1); 476 this.email.setSubject(strSubject); 477 this.email.setMsg("Test txt msg"); 478 479 this.email.send(); 480 this.fakeMailServer.stop(); 481 // validate txt message 482 validateSend( 483 this.fakeMailServer, 484 strSubject, 485 this.email.getTextMsg(), 486 this.email.getFromAddress(), 487 this.email.getToList(), 488 this.email.getCcList(), 489 this.email.getBccList(), 490 true); 491 492 // validate html message 493 validateSend( 494 this.fakeMailServer, 495 strSubject, 496 this.email.getHtmlMsg(), 497 this.email.getFromAddress(), 498 this.email.getToList(), 499 this.email.getCcList(), 500 this.email.getBccList(), 501 false); 502 503 } 504 505 }