Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
 
3
/*
4
 * This file is part of the symfony package.
5
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
 
11
/**
12
 * sfTesterMailer implements tests for the symfony mailer object.
13
 *
14
 * @package    symfony
15
 * @subpackage test
16
 * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
17
 * @version    SVN: $Id: sfTesterMailer.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
18
 */
19
class sfTesterMailer extends sfTester
20
{
21
  protected
22
    $logger  = null,
23
    $message = null;
24
 
25
  /**
26
   * Prepares the tester.
27
   */
28
  public function prepare()
29
  {
30
  }
31
 
32
  /**
33
   * Initializes the tester.
34
   */
35
  public function initialize()
36
  {
37
    $this->logger = $this->browser->getContext()->getMailer()->getLogger();
38
 
39
    if ($this->logger->countMessages())
40
    {
41
      $messages = $this->logger->getMessages();
42
 
43
      $this->message = $messages[0];
44
    }
45
  }
46
 
47
  /**
48
   * Tests if message was send and optional how many.
49
   *
50
   * @param int $nb number of messages
51
   *
52
   * @return sfTestFunctionalBase|sfTester
53
   */
54
  public function hasSent($nb = null)
55
  {
56
    if (null === $nb)
57
    {
58
      $this->tester->ok($this->logger->countMessages() > 0, 'mailer sent some email(s).');
59
    }
60
    else
61
    {
62
      $this->tester->is($this->logger->countMessages(), $nb, sprintf('mailer sent %s email(s).', $nb));
63
    }
64
 
65
    return $this->getObjectToReturn();
66
  }
67
 
68
  /**
69
   * Outputs some debug information about mails sent during the current request.
70
   */
71
  public function debug()
72
  {
73
    foreach ($this->logger->getMessages() as $message)
74
    {
75
      echo $message->toString()."\n\n";
76
    }
77
 
78
    exit(1);
79
  }
80
 
81
  /**
82
   * Changes the context to use the email corresponding to the given criteria.
83
   *
84
   * @param string|array $to       the email or array(email => alias)
85
   * @param int          $position address position
86
   *
87
   * @return sfTestFunctionalBase|sfTester
88
   */
89
  public function withMessage($to, $position = 1)
90
  {
91
    $messageEmail = $to;
92
    if(is_array($to))
93
    {
94
      $alias        = current($to);
95
      $to           = key($to);
96
      $messageEmail = sprintf('%s <%s>', $alias, $to);
97
    }
98
 
99
    $matches = 0;
100
    foreach ($this->logger->getMessages() as $message)
101
    {
102
      $email = $message->getTo();
103
      if ($to == key($email))
104
      {
105
        $matches++;
106
 
107
        if ($matches == $position)
108
        {
109
          $this->message = $message;
110
 
111
          if(isset($alias) AND $alias != current($email))
112
          {
113
            break;
114
          }
115
 
116
          $this->tester->pass(sprintf('switch context to the message number "%s" sent to "%s"', $position, $messageEmail));
117
 
118
          return $this;
119
        }
120
      }
121
    }
122
 
123
    $this->tester->fail(sprintf('unable to find a message sent to "%s"', $messageEmail));
124
 
125
    return $this;
126
  }
127
 
128
  /**
129
   * Tests for a mail message body.
130
   *
131
   * @param string $value regular expression or value
132
   *
133
   * @return sfTestFunctionalBase|sfTester
134
   */
135
  public function checkBody($value)
136
  {
137
    if (!$this->message)
138
    {
139
      $this->tester->fail('unable to test as no email were sent');
140
    }
141
 
142
    $body = $this->message->getBody();
143
    $ok = false;
144
    $regex = false;
145
    $mustMatch = true;
146
    if (preg_match('/^(!)?([^a-zA-Z0-9\\\\]).+?\\2[ims]?$/', $value, $match))
147
    {
148
      $regex = $value;
149
      if ($match[1] == '!')
150
      {
151
        $mustMatch = false;
152
        $regex = substr($value, 1);
153
      }
154
    }
155
 
156
    if (false !== $regex)
157
    {
158
      if ($mustMatch)
159
      {
160
        if (preg_match($regex, $body))
161
        {
162
          $ok = true;
163
          $this->tester->pass(sprintf('email body matches "%s"', $value));
164
        }
165
      }
166
      else
167
      {
168
        if (preg_match($regex, $body))
169
        {
170
          $ok = true;
171
          $this->tester->fail(sprintf('email body does not match "%s"', $value));
172
        }
173
      }
174
    }
175
    else if ($body == $value)
176
    {
177
      $ok = true;
178
      $this->tester->pass(sprintf('email body is "%s"', $value));
179
    }
180
 
181
    if (!$ok)
182
    {
183
      if (!$mustMatch)
184
      {
185
        $this->tester->pass(sprintf('email body matches "%s"', $value));
186
      }
187
      else
188
      {
189
        $this->tester->fail(sprintf('email body matches "%s"', $value));
190
      }
191
    }
192
 
193
    return $this->getObjectToReturn();
194
  }
195
 
196
  /**
197
   * Tests for a mail message header.
198
   *
199
   * @param string $key   entry to test
200
   * @param string $value regular expression or value
201
   *
202
   * @return sfTestFunctionalBase|sfTester
203
   */
204
  public function checkHeader($key, $value)
205
  {
206
    if (!$this->message)
207
    {
208
      $this->tester->fail('unable to test as no email were sent');
209
    }
210
 
211
    $headers = array();
212
    foreach ($this->message->getHeaders()->getAll($key) as $header)
213
    {
214
      $headers[] = $header->getFieldBody();
215
    }
216
    $current = implode(', ', $headers);
217
    $ok = false;
218
    $regex = false;
219
    $mustMatch = true;
220
    if (preg_match('/^(!)?([^a-zA-Z0-9\\\\]).+?\\2[ims]?$/', $value, $match))
221
    {
222
      $regex = $value;
223
      if ($match[1] == '!')
224
      {
225
        $mustMatch = false;
226
        $regex = substr($value, 1);
227
      }
228
    }
229
 
230
    foreach ($headers as $header)
231
    {
232
      if (false !== $regex)
233
      {
234
        if ($mustMatch)
235
        {
236
          if (preg_match($regex, $header))
237
          {
238
            $ok = true;
239
            $this->tester->pass(sprintf('email header "%s" matches "%s" (%s)', $key, $value, $current));
240
            break;
241
          }
242
        }
243
        else
244
        {
245
          if (preg_match($regex, $header))
246
          {
247
            $ok = true;
248
            $this->tester->fail(sprintf('email header "%s" does not match "%s" (%s)', $key, $value, $current));
249
            break;
250
          }
251
        }
252
      }
253
      else if ($header == $value)
254
      {
255
        $ok = true;
256
        $this->tester->pass(sprintf('email header "%s" is "%s" (%s)', $key, $value, $current));
257
        break;
258
      }
259
    }
260
 
261
    if (!$ok)
262
    {
263
      if (!$mustMatch)
264
      {
265
        $this->tester->pass(sprintf('email header "%s" matches "%s" (%s)', $key, $value, $current));
266
      }
267
      else
268
      {
269
        $this->tester->fail(sprintf('email header "%s" matches "%s" (%s)', $key, $value, $current));
270
      }
271
    }
272
 
273
    return $this->getObjectToReturn();
274
  }
275
}