"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const chai_1 = require("chai");
const fs_extra_1 = require("fs-extra");
const path_1 = require("path");
const server_commands_1 = require("../../shared/server-commands");
const shared_1 = require("./shared");
describe('Test misc endpoints', function () {
    let server;
    let wellKnownPath;
    before(function () {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.timeout(120000);
            server = yield (0, server_commands_1.createSingleServer)(1);
            yield (0, server_commands_1.setAccessTokensToServers)([server]);
            wellKnownPath = server.getDirectoryPath('well-known');
        });
    });
    describe('Test a well known endpoints', function () {
        it('Should get security.txt', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/security.txt',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.text).to.contain('security issue');
            });
        });
        it('Should get nodeinfo', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/nodeinfo',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.body.links).to.be.an('array');
                (0, chai_1.expect)(res.body.links).to.have.lengthOf(1);
                (0, chai_1.expect)(res.body.links[0].rel).to.equal('http://nodeinfo.diaspora.software/ns/schema/2.0');
            });
        });
        it('Should get dnt policy text', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/dnt-policy.txt',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.text).to.contain('http://www.w3.org/TR/tracking-dnt');
            });
        });
        it('Should get dnt policy', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/dnt',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.body.tracking).to.equal('N');
            });
        });
        it('Should get change-password location', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/change-password',
                    expectedStatus: 302
                });
                (0, chai_1.expect)(res.header.location).to.equal('/my-account/settings');
            });
        });
        it('Should test webfinger', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const resource = 'acct:peertube@' + server.host;
                const accountUrl = server.url + '/accounts/peertube';
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/webfinger?resource=' + resource,
                    expectedStatus: 200
                });
                const data = res.body;
                (0, chai_1.expect)(data.subject).to.equal(resource);
                (0, chai_1.expect)(data.aliases).to.contain(accountUrl);
                const self = data.links.find(l => l.rel === 'self');
                (0, chai_1.expect)(self).to.exist;
                (0, chai_1.expect)(self.type).to.equal('application/activity+json');
                (0, chai_1.expect)(self.href).to.equal(accountUrl);
                const remoteInteract = data.links.find(l => l.rel === 'http://ostatus.org/schema/1.0/subscribe');
                (0, chai_1.expect)(remoteInteract).to.exist;
                (0, chai_1.expect)(remoteInteract.template).to.equal(server.url + '/remote-interaction?uri={uri}');
            });
        });
        it('Should return 404 for non-existing files in /.well-known', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/non-existing-file',
                    expectedStatus: 404
                });
            });
        });
        it('Should return custom file from /.well-known', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const filename = 'existing-file.json';
                yield (0, fs_extra_1.writeJson)((0, path_1.join)(wellKnownPath, filename), { iThink: 'therefore I am' });
                const { body } = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/.well-known/' + filename,
                    expectedStatus: 200
                });
                (0, chai_1.expect)(body.iThink).to.equal('therefore I am');
            });
        });
    });
    describe('Test classic static endpoints', function () {
        it('Should get robots.txt', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/robots.txt',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.text).to.contain('User-agent');
            });
        });
        it('Should get security.txt', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/security.txt',
                    expectedStatus: 301
                });
            });
        });
        it('Should get nodeinfo', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/nodeinfo/2.0.json',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.body.software.name).to.equal('peertube');
                (0, chai_1.expect)(res.body.usage.users.activeMonth).to.equal(1);
                (0, chai_1.expect)(res.body.usage.users.activeHalfyear).to.equal(1);
            });
        });
    });
    describe('Test bots endpoints', function () {
        it('Should get the empty sitemap', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/sitemap.xml',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.text).to.contain('xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"');
                (0, chai_1.expect)(res.text).to.contain('<url><loc>' + server.url + '/about/instance</loc></url>');
            });
        });
        it('Should get the empty cached sitemap', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/sitemap.xml',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.text).to.contain('xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"');
                (0, chai_1.expect)(res.text).to.contain('<url><loc>' + server.url + '/about/instance</loc></url>');
            });
        });
        it('Should add videos, channel and accounts and get sitemap', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                this.timeout(35000);
                yield server.videos.upload({ attributes: { name: 'video 1', nsfw: false } });
                yield server.videos.upload({ attributes: { name: 'video 2', nsfw: false } });
                yield server.videos.upload({ attributes: { name: 'video 3', privacy: 3 } });
                yield server.channels.create({ attributes: { name: 'channel1', displayName: 'channel 1' } });
                yield server.channels.create({ attributes: { name: 'channel2', displayName: 'channel 2' } });
                yield server.users.create({ username: 'user1', password: 'password' });
                yield server.users.create({ username: 'user2', password: 'password' });
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/sitemap.xml?t=1',
                    expectedStatus: 200
                });
                (0, chai_1.expect)(res.text).to.contain('xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"');
                (0, chai_1.expect)(res.text).to.contain('<url><loc>' + server.url + '/about/instance</loc></url>');
                (0, chai_1.expect)(res.text).to.contain('<video:title>video 1</video:title>');
                (0, chai_1.expect)(res.text).to.contain('<video:title>video 2</video:title>');
                (0, chai_1.expect)(res.text).to.not.contain('<video:title>video 3</video:title>');
                (0, chai_1.expect)(res.text).to.contain('<url><loc>' + server.url + '/video-channels/channel1</loc></url>');
                (0, chai_1.expect)(res.text).to.contain('<url><loc>' + server.url + '/video-channels/channel2</loc></url>');
                (0, chai_1.expect)(res.text).to.contain('<url><loc>' + server.url + '/accounts/user1</loc></url>');
                (0, chai_1.expect)(res.text).to.contain('<url><loc>' + server.url + '/accounts/user2</loc></url>');
            });
        });
        it('Should not fail with big title/description videos', function () {
            return tslib_1.__awaiter(this, void 0, void 0, function* () {
                const name = 'v'.repeat(115);
                yield server.videos.upload({ attributes: { name, description: 'd'.repeat(2500), nsfw: false } });
                const res = yield (0, server_commands_1.makeGetRequest)({
                    url: server.url,
                    path: '/sitemap.xml?t=2',
                    expectedStatus: 200
                });
                yield (0, shared_1.expectLogDoesNotContain)(server, 'Warning in sitemap generation');
                yield (0, shared_1.expectLogDoesNotContain)(server, 'Error in sitemap generation');
                (0, chai_1.expect)(res.text).to.contain(`<video:title>${'v'.repeat(97)}...</video:title>`);
            });
        });
    });
    after(function () {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            yield (0, server_commands_1.cleanupTests)([server]);
        });
    });
});
//# sourceMappingURL=misc-endpoints.js.map