1<?php 2 3/** 4 * Extends the mailer class to expose internal variables for testing 5 */ 6class TestMailer extends Mailer { 7 public function prop($name){ 8 return $this->$name; 9 } 10 11 public function &propRef($name) { 12 return $this->$name; 13 } 14 15 public function prepareHeaders() { 16 return parent::prepareHeaders(); 17 } 18 19 public function cleanHeaders() { 20 parent::cleanHeaders(); 21 } 22 23} 24 25class mailer_test extends DokuWikiTest { 26 27 28 function test_userheader(){ 29 $mail = new TestMailer(); 30 $headers = $mail->prop('headers'); 31 $this->assertArrayNotHasKey('X-Dokuwiki-User',$headers); 32 33 $_SERVER['REMOTE_USER'] = 'andi'; 34 $mail = new TestMailer(); 35 $headers = $mail->prop('headers'); 36 $this->assertArrayHasKey('X-Dokuwiki-User',$headers); 37 } 38 39 function test_setHeader(){ 40 $mail = new TestMailer(); 41 42 // check existance of default headers 43 $headers = $mail->prop('headers'); 44 $this->assertArrayHasKey('X-Mailer',$headers); 45 $this->assertArrayHasKey('X-Dokuwiki-Title',$headers); 46 $this->assertArrayHasKey('X-Dokuwiki-Server',$headers); 47 $this->assertArrayHasKey('X-Auto-Response-Suppress',$headers); 48 $this->assertArrayHasKey('List-Id',$headers); 49 50 // set a bunch of test headers 51 $mail->setHeader('test-header','bla'); 52 $mail->setHeader('to','A valid ASCII name <test@example.com>'); 53 $mail->setHeader('from',"Thös ne\needs\x00serious cleaning$§%."); 54 $mail->setHeader('bad',"Thös ne\needs\x00serious cleaning$§%.",false); 55 $mail->setHeader("weird\n*+\x00foo.-_@bar?",'now clean'); 56 57 // are they set? 58 $headers = $mail->prop('headers'); 59 $this->assertArrayHasKey('Test-Header',$headers); 60 $this->assertEquals('bla',$headers['Test-Header']); 61 $this->assertArrayHasKey('To',$headers); 62 $this->assertEquals('A valid ASCII name <test@example.com>',$headers['To']); 63 $this->assertArrayHasKey('From',$headers); 64 $this->assertEquals('Ths neeedsserious cleaning.',$headers['From']); 65 $this->assertArrayHasKey('Bad',$headers); 66 $this->assertEquals("Thös ne\needs\x00serious cleaning$§%.",$headers['Bad']); 67 $this->assertArrayHasKey('Weird+foo.-_@bar',$headers); 68 69 // unset a header again 70 $mail->setHeader('test-header',''); 71 $headers = $mail->prop('headers'); 72 $this->assertArrayNotHasKey('Test-Header',$headers); 73 } 74 75 function test_addresses(){ 76 $mail = new TestMailer(); 77 78 $mail->to('andi@splitbrain.org'); 79 $mail->cleanHeaders(); 80 $headers = $mail->prop('headers'); 81 $this->assertEquals('andi@splitbrain.org', $headers['To']); 82 83 $mail->to('<andi@splitbrain.org>'); 84 $mail->cleanHeaders(); 85 $headers = $mail->prop('headers'); 86 $this->assertEquals('andi@splitbrain.org', $headers['To']); 87 88 $mail->to('Andreas Gohr <andi@splitbrain.org>'); 89 $mail->cleanHeaders(); 90 $headers = $mail->prop('headers'); 91 $this->assertEquals('Andreas Gohr <andi@splitbrain.org>', $headers['To']); 92 93 $mail->to('Andreas Gohr <andi@splitbrain.org> , foo <foo@example.com>'); 94 $mail->cleanHeaders(); 95 $headers = $mail->prop('headers'); 96 $this->assertEquals('Andreas Gohr <andi@splitbrain.org>, foo <foo@example.com>', $headers['To']); 97 98 $mail->to('Möp <moep@example.com> , foo <foo@example.com>'); 99 $mail->cleanHeaders(); 100 $headers = $mail->prop('headers'); 101 $this->assertEquals('=?UTF-8?B?TcO2cA==?= <moep@example.com>, foo <foo@example.com>', $headers['To']); 102 103 $mail->to(array('Möp <moep@example.com> ',' foo <foo@example.com>')); 104 $mail->cleanHeaders(); 105 $headers = $mail->prop('headers'); 106 $this->assertEquals('=?UTF-8?B?TcO2cA==?= <moep@example.com>, foo <foo@example.com>', $headers['To']); 107 108 $mail->to(array('Beet, L van <lvb@example.com>',' foo <foo@example.com>')); 109 $mail->cleanHeaders(); 110 $headers = $mail->prop('headers'); 111 $this->assertEquals('=?UTF-8?B?QmVldCwgTCB2YW4=?= <lvb@example.com>, foo <foo@example.com>', $headers['To']); 112 113 114 } 115 116 function test_simplemail(){ 117 global $conf; 118 $conf['htmlmail'] = 0; 119 $mail = new TestMailer(); 120 $mail->to('test@example.com'); 121 $mail->setBody('A test mail in ASCII'); 122 123 $dump = $mail->dump(); 124 $this->assertNotRegexp('/Content-Type: multipart/',$dump); 125 $this->assertRegexp('#Content-Type: text/plain; charset=UTF-8#',$dump); 126 $this->assertRegexp('/'.base64_encode('A test mail in ASCII').'/',$dump); 127 128 $conf['htmlmail'] = 1; 129 } 130 131 function test_replacements(){ 132 $mail = new TestMailer(); 133 134 $replacements = array( '@DATE@','@BROWSER@','@IPADDRESS@','@HOSTNAME@', 135 '@TITLE@','@DOKUWIKIURL@','@USER@','@NAME@','@MAIL@'); 136 $mail->setBody('A test mail in with replacements '.join(' ',$replacements)); 137 138 $text = $mail->prop('text'); 139 $html = $mail->prop('html'); 140 141 foreach($replacements as $repl){ 142 $this->assertNotRegexp("/$repl/",$text,"$repl replacement still in text"); 143 $this->assertNotRegexp("/$repl/",$html,"$repl replacement still in html"); 144 } 145 } 146 147 /** 148 * @see https://forum.dokuwiki.org/post/35822 149 */ 150 function test_emptyBCCorCC() { 151 $mail = new TestMailer(); 152 $headers = &$mail->propRef('headers'); 153 $headers['Bcc'] = ''; 154 $headers['Cc'] = ''; 155 $header = $mail->prepareHeaders(); 156 $this->assertEquals(0, preg_match('/(^|\n)Bcc: (\n|$)/', $header), 'Bcc found in headers.'); 157 $this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Bcc found in headers.'); 158 } 159} 160//Setup VIM: ex: et ts=4 : 161