OSDN Git Service

t: update api/user.t for password/email change related test
authorhylom <hylom@users.sourceforge.jp>
Thu, 8 Nov 2018 12:01:41 +0000 (21:01 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 8 Nov 2018 12:01:41 +0000 (21:01 +0900)
src/newslash_web/t/api/user.t

index 3d5c8c7..26d5801 100644 (file)
@@ -9,6 +9,8 @@ use POSIX qw(strftime);
 use DateTime::Format::MySQL;
 
 use Newslash::Util::TestMan;
+use Newslash::Eventd::Handlers;
+use Data::Dumper;
 
 my $t = Test::Mojo->new('Newslash::Web');
 my $test_man = Newslash::Util::TestMan->new($t);
@@ -117,24 +119,57 @@ subtest 'update email' => sub {
     my $params = $users->param->select(uid => $user->{uid});
     is($params->{new_email}, $new_address, "insert new address to params table");
 
-    # my $dt = eval { DateTime::Format::MySQL->parse_datetime($params->{new_email_ts}); };
-    # my $e = $@;
-    # ok(!$e, "check new_email_ts");
-    # diag $e if !$e;
-    # diag $params->{new_email_ts} if !$e;
-
-    # if (!$e) {
-    #     my $now_dt = DateTime->now;
-    #     my $delta = $now_dt->epoch - $dt->epoch;
-    #     ok($delta < 3600, "new_email_ts is updated");
-    # }
-
     # check if event emited
     my $events = $t->app->model('events');
     my $ev = $events->select(event_type => "user",
                              event_subtype => "change_email",
-                             source_user_id => $user->{uid});
-    ok($ev, "event emited");
+                             source_user_id => $user->{uid},
+                             active => 1,
+                            );
+    ok($ev && @$ev > 0, "event emited");
+
+    # check if event processed correctly
+    my $handlers = Newslash::Eventd::Handlers->new($t->app, { test => 1 });
+    my $rs = $handlers->execute($ev->[0]);
+    ok($rs, "event processed correctly");
+
+    # check email que
+    my $user_handler = $handlers->{_handlers}->{user};
+    ok($user_handler, "retrieve user event handler");
+    my $que = $user_handler->{_test_mailque};
+
+    # check validate mail
+    my $validate_mail = pop @$que;
+    ok($validate_mail, "retrieve validate mail");
+    is($validate_mail->{to}, $new_address, "validate mail address is correct");
+    my $url_regex = qr|/my/change_email\?nickname=$user->{nickname}&token=(\S+)|;
+    ok($validate_mail->{body} =~ $url_regex, "validate mail has correct url");
+    my $token = $1;
+    ok($token, "extract token from mail");
+    diag Dumper $validate_mail if !$1;
+
+    # check notify mail
+    my $notify_mail = pop @$que;
+    ok($notify_mail, "retrieve notify mail");
+    is($notify_mail->{to}, $user->{realemail}, "notify mail address is correct");
+    my $notify_url = "/my/change_email?nickname=$user->{nickname}&cancel=1";
+    my $index = index($notify_mail->{body}, $notify_url);
+    ok($index != -1, "notify mail has correct url");
+    diag Dumper $notify_mail if $index == 1;
+
+    # check ts param set
+    $params = $users->param->select(uid => $user->{uid});
+    my $dt = eval { DateTime::Format::MySQL->parse_datetime($params->{new_email_token_ts}); };
+    my $e = $@;
+    ok(!$e, "check new_email_ts");
+    diag $e if $e;
+    diag Dumper $params if $e;
+
+    if (!$e) {
+        my $now_dt = DateTime->now;
+        my $delta = $now_dt->epoch - $dt->epoch;
+        ok($delta < 3600, "new_email_ts is updated");
+    }
 
     # done
     $test_man->logout;
@@ -164,8 +199,28 @@ subtest 'update password' => sub {
     my $events = $t->app->model('events');
     my $ev = $events->select(event_type => "user",
                              event_subtype => "update_password",
-                             source_user_id => $user->{uid});
-    ok($ev, "event emited");
+                             source_user_id => $user->{uid},
+                             active => 1);
+    ok($ev && @$ev > 0, "event emited");
+
+    # check if event processed correctly
+    my $handlers = Newslash::Eventd::Handlers->new($t->app, { test => 1 });
+    my $rs = $handlers->execute($ev->[0]);
+    ok($rs, "event processed correctly");
+
+    # check email que
+    my $user_handler = $handlers->{_handlers}->{user};
+    ok($user_handler, "retrieve user event handler");
+    my $que = $user_handler->{_test_mailque};
+
+    # check notify mail
+    my $notify_mail = pop @$que;
+    ok($notify_mail, "retrieve notify mail");
+    is($notify_mail->{to}, $user->{realemail}, "notify mail address is correct");
+    my $regex = qr|パスワード|;
+    $rs = $notify_mail->{title} =~ $regex;
+    ok($rs, "notify mail has correct title");
+    diag Dumper $notify_mail if !$rs;
 
     #done
     $test_man->logout;