"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
require("mocha");
const chai = (0, tslib_1.__importStar)(require("chai"));
const shared_1 = require("../../shared");
const server_commands_1 = require("../../../../shared/server-commands");
const expect = chai.expect;
describe('Test emails', function () {
    let server;
    let userId;
    let userId2;
    let userAccessToken;
    let videoShortUUID;
    let videoId;
    let videoUserUUID;
    let verificationString;
    let verificationString2;
    const emails = [];
    const user = {
        username: 'user_1',
        password: 'super_password'
    };
    let emailPort;
    before(function () {
        return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
            this.timeout(50000);
            emailPort = yield shared_1.MockSmtpServer.Instance.collectEmails(emails);
            const overrideConfig = {
                smtp: {
                    hostname: 'localhost',
                    port: emailPort
                }
            };
            server = yield (0, server_commands_1.createSingleServer)(1, overrideConfig);
            yield (0, server_commands_1.setAccessTokensToServers)([server]);
            {
                const created = yield server.users.create({ username: user.username, password: user.password });
                userId = created.id;
                userAccessToken = yield server.login.getAccessToken(user);
            }
            {
                const attributes = { name: 'my super user video' };
                const { uuid } = yield server.videos.upload({ token: userAccessToken, attributes });
                videoUserUUID = uuid;
            }
            {
                const attributes = {
                    name: 'my super name'
                };
                const { shortUUID, id } = yield server.videos.upload({ attributes });
                videoShortUUID = shortUUID;
                videoId = id;
            }
        });
    });
    describe('When resetting user password', function () {
        it('Should ask to reset the password', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                yield server.users.askResetPassword({ email: 'user_1@example.com' });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(1);
                const email = emails[0];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('user_1@example.com');
                expect(email['subject']).contains('password');
                const verificationStringMatches = /verificationString=([a-z0-9]+)/.exec(email['text']);
                expect(verificationStringMatches).not.to.be.null;
                verificationString = verificationStringMatches[1];
                expect(verificationString).to.have.length.above(2);
                const userIdMatches = /userId=([0-9]+)/.exec(email['text']);
                expect(userIdMatches).not.to.be.null;
                userId = parseInt(userIdMatches[1], 10);
                expect(verificationString).to.not.be.undefined;
            });
        });
        it('Should not reset the password with an invalid verification string', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.users.resetPassword({
                    userId,
                    verificationString: verificationString + 'b',
                    password: 'super_password2',
                    expectedStatus: 403
                });
            });
        });
        it('Should reset the password', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.users.resetPassword({ userId, verificationString, password: 'super_password2' });
            });
        });
        it('Should not reset the password with the same verification string', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.users.resetPassword({
                    userId,
                    verificationString,
                    password: 'super_password3',
                    expectedStatus: 403
                });
            });
        });
        it('Should login with this new password', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                user.password = 'super_password2';
                yield server.login.getAccessToken(user);
            });
        });
    });
    describe('When creating a user without password', function () {
        it('Should send a create password email', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                yield server.users.create({ username: 'create_password', password: '' });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(2);
                const email = emails[1];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('create_password@example.com');
                expect(email['subject']).contains('account');
                expect(email['subject']).contains('password');
                const verificationStringMatches = /verificationString=([a-z0-9]+)/.exec(email['text']);
                expect(verificationStringMatches).not.to.be.null;
                verificationString2 = verificationStringMatches[1];
                expect(verificationString2).to.have.length.above(2);
                const userIdMatches = /userId=([0-9]+)/.exec(email['text']);
                expect(userIdMatches).not.to.be.null;
                userId2 = parseInt(userIdMatches[1], 10);
            });
        });
        it('Should not reset the password with an invalid verification string', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.users.resetPassword({
                    userId: userId2,
                    verificationString: verificationString2 + 'c',
                    password: 'newly_created_password',
                    expectedStatus: 403
                });
            });
        });
        it('Should reset the password', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.users.resetPassword({
                    userId: userId2,
                    verificationString: verificationString2,
                    password: 'newly_created_password'
                });
            });
        });
        it('Should login with this new password', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.login.getAccessToken({
                    username: 'create_password',
                    password: 'newly_created_password'
                });
            });
        });
    });
    describe('When creating an abuse', function () {
        it('Should send the notification email', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                const reason = 'my super bad reason';
                yield server.abuses.report({ token: userAccessToken, videoId, reason });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(3);
                const email = emails[2];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('admin' + server.internalServerNumber + '@example.com');
                expect(email['subject']).contains('abuse');
                expect(email['text']).contains(videoShortUUID);
            });
        });
    });
    describe('When blocking/unblocking user', function () {
        it('Should send the notification email when blocking a user', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                const reason = 'my super bad reason';
                yield server.users.banUser({ userId, reason });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(4);
                const email = emails[3];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('user_1@example.com');
                expect(email['subject']).contains(' blocked');
                expect(email['text']).contains(' blocked');
                expect(email['text']).contains('bad reason');
            });
        });
        it('Should send the notification email when unblocking a user', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                yield server.users.unbanUser({ userId });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(5);
                const email = emails[4];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('user_1@example.com');
                expect(email['subject']).contains(' unblocked');
                expect(email['text']).contains(' unblocked');
            });
        });
    });
    describe('When blacklisting a video', function () {
        it('Should send the notification email', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                const reason = 'my super reason';
                yield server.blacklist.add({ videoId: videoUserUUID, reason });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(6);
                const email = emails[5];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('user_1@example.com');
                expect(email['subject']).contains(' blacklisted');
                expect(email['text']).contains('my super user video');
                expect(email['text']).contains('my super reason');
            });
        });
        it('Should send the notification email', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                yield server.blacklist.remove({ videoId: videoUserUUID });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(7);
                const email = emails[6];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('user_1@example.com');
                expect(email['subject']).contains(' unblacklisted');
                expect(email['text']).contains('my super user video');
            });
        });
        it('Should have the manage preferences link in the email', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                const email = emails[6];
                expect(email['text']).to.contain('Manage your notification preferences');
            });
        });
    });
    describe('When verifying a user email', function () {
        it('Should ask to send the verification email', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                this.timeout(10000);
                yield server.users.askSendVerifyEmail({ email: 'user_1@example.com' });
                yield (0, server_commands_1.waitJobs)(server);
                expect(emails).to.have.lengthOf(8);
                const email = emails[7];
                expect(email['from'][0]['name']).equal('PeerTube');
                expect(email['from'][0]['address']).equal('test-admin@localhost');
                expect(email['to'][0]['address']).equal('user_1@example.com');
                expect(email['subject']).contains('Verify');
                const verificationStringMatches = /verificationString=([a-z0-9]+)/.exec(email['text']);
                expect(verificationStringMatches).not.to.be.null;
                verificationString = verificationStringMatches[1];
                expect(verificationString).to.not.be.undefined;
                expect(verificationString).to.have.length.above(2);
                const userIdMatches = /userId=([0-9]+)/.exec(email['text']);
                expect(userIdMatches).not.to.be.null;
                userId = parseInt(userIdMatches[1], 10);
            });
        });
        it('Should not verify the email with an invalid verification string', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.users.verifyEmail({
                    userId,
                    verificationString: verificationString + 'b',
                    isPendingEmail: false,
                    expectedStatus: 403
                });
            });
        });
        it('Should verify the email', function () {
            return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
                yield server.users.verifyEmail({ userId, verificationString });
            });
        });
    });
    after(function () {
        return (0, tslib_1.__awaiter)(this, void 0, void 0, function* () {
            shared_1.MockSmtpServer.Instance.kill();
            yield (0, server_commands_1.cleanupTests)([server]);
        });
    });
});
//# sourceMappingURL=email.js.map