"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", { value: true });
var strong_mock_1 = require("strong-mock");
var npm_1 = require("./npm");
var npm_error_1 = require("./npm-error");
describe("npm", function () {
    function setup() {
        var execa = strong_mock_1.mock();
        var npm = new npm_1.Npm(strong_mock_1.instance(execa));
        return {
            execa: execa,
            npm: npm,
        };
    }
    describe("authenticate", function () {
        it("should authenticate", function () { return __awaiter(void 0, void 0, void 0, function () {
            var _a, execa, npm, context, env;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = setup(), execa = _a.execa, npm = _a.npm;
                        context = strong_mock_1.mock();
                        env = {
                            NPM_TOKEN: "token",
                        };
                        strong_mock_1.when(context.env).thenReturn(env);
                        strong_mock_1.when(context.cwd).thenReturn("cwd");
                        strong_mock_1.when(execa("npm", [
                            "config",
                            "set",
                            "//registry.npmjs.org/:_authToken",
                            "${NPM_TOKEN}",
                            "--json",
                        ], {
                            cwd: "cwd",
                            env: env,
                        })).thenResolve(undefined);
                        return [4 /*yield*/, npm.authenticate({ registry: "https://registry.npmjs.org/" }, strong_mock_1.instance(context))];
                    case 1:
                        _b.sent();
                        strong_mock_1.verifyAll();
                        return [2 /*return*/];
                }
            });
        }); });
    });
    describe("whoAmI", function () {
        it("should check the authentication", function () { return __awaiter(void 0, void 0, void 0, function () {
            var _a, execa, npm, context, env;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = setup(), execa = _a.execa, npm = _a.npm;
                        context = strong_mock_1.mock();
                        env = {
                            NPM_TOKEN: "token",
                        };
                        strong_mock_1.when(context.env).thenReturn(env);
                        strong_mock_1.when(context.cwd).thenReturn("cwd");
                        strong_mock_1.when(execa("npm", ["whoami", "--json"], {
                            cwd: "cwd",
                            env: env,
                        })).thenResolve(undefined);
                        return [4 /*yield*/, npm.whoAmI(strong_mock_1.instance(context))];
                    case 1:
                        _b.sent();
                        strong_mock_1.verifyAll();
                        return [2 /*return*/];
                }
            });
        }); });
    });
    describe("deprecate", function () {
        it("should deprecate the given version", function () { return __awaiter(void 0, void 0, void 0, function () {
            var _a, execa, npm, context, env;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = setup(), execa = _a.execa, npm = _a.npm;
                        context = strong_mock_1.mock();
                        env = {
                            NPM_TOKEN: "token",
                        };
                        strong_mock_1.when(context.env).thenReturn(env);
                        strong_mock_1.when(context.cwd).thenReturn("cwd");
                        strong_mock_1.when(execa("npm", ["deprecate", "name@version", "reason", "--json"], {
                            cwd: "cwd",
                            env: env,
                        })).thenResolve(undefined);
                        return [4 /*yield*/, npm.deprecate({ name: "name", version: "version", reason: "reason" }, strong_mock_1.instance(context))];
                    case 1:
                        _b.sent();
                        strong_mock_1.verifyAll();
                        return [2 /*return*/];
                }
            });
        }); });
        it("should return a NpmError in case of error", function () { return __awaiter(void 0, void 0, void 0, function () {
            var _a, execa, npm, context, env, error;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = setup(), execa = _a.execa, npm = _a.npm;
                        context = strong_mock_1.mock();
                        env = {
                            NPM_TOKEN: "token",
                        };
                        strong_mock_1.when(context.env).thenReturn(env);
                        strong_mock_1.when(context.cwd).thenReturn("cwd");
                        error = new Error("error");
                        error.stdout = JSON.stringify({
                            error: {
                                code: "E404",
                                summary: "Not Found",
                            },
                        });
                        strong_mock_1.when(execa("npm", ["deprecate", "name@version", "reason", "--json"], {
                            cwd: "cwd",
                            env: env,
                        })).thenReject(error);
                        return [4 /*yield*/, expect(npm.deprecate({ name: "name", version: "version", reason: "reason" }, strong_mock_1.instance(context))).rejects.toEqual(new npm_error_1.NpmError("E404", "Not Found", error))];
                    case 1:
                        _b.sent();
                        strong_mock_1.verifyAll();
                        return [2 /*return*/];
                }
            });
        }); });
        it("should return a NpmError when the error is dumped in stderr with some prefix", function () { return __awaiter(void 0, void 0, void 0, function () {
            var _a, execa, npm, context, env, error;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = setup(), execa = _a.execa, npm = _a.npm;
                        context = strong_mock_1.mock();
                        env = {
                            NPM_TOKEN: "token",
                        };
                        strong_mock_1.when(context.env).thenReturn(env);
                        strong_mock_1.when(context.cwd).thenReturn("cwd");
                        error = new Error("error");
                        error.stdout = "";
                        error.stderr =
                            "npm ERR! code E404\n" +
                                "npm ERR! 404 Not Found - PUT https://registry.npmjs.org/semantic-release-npm-deprecate-old-versions - Not found\n" +
                                "npm ERR! 404 \n" +
                                "npm ERR! 404  'semantic-release-npm-deprecate-old-versions@1.2.0-beta.1' is not in this registry.\n" +
                                "npm ERR! 404 You should bug the author to publish it (or use the name yourself!)\n" +
                                "npm ERR! 404 \n" +
                                "npm ERR! 404 Note that you can also install from a\n" +
                                "npm ERR! 404 tarball, folder, http url, or git url.\n" +
                                "{\n" +
                                '  "error": {\n' +
                                '    "code": "E404",\n' +
                                '    "summary": "Not Found",\n' +
                                "    \"detail\": \"\\n 'semantic-release-npm-deprecate-old-versions@1.2.0-beta.1' is not in this registry.\\nYou should bug the author to publish it (or use the name yourself!)\\n\\nNote that you can also install from a\\ntarball, folder, http url, or git url.\"\n" +
                                "  }\n" +
                                "}\n" +
                                "\n" +
                                "npm ERR! A complete log of this run can be found in:\n" +
                                "npm ERR!     /home/runner/.npm/_logs/2021-12-26T12_29_13_075Z-debug.log";
                        strong_mock_1.when(execa("npm", ["deprecate", "name@version", "reason", "--json"], {
                            cwd: "cwd",
                            env: env,
                        })).thenReject(error);
                        return [4 /*yield*/, expect(npm.deprecate({ name: "name", version: "version", reason: "reason" }, strong_mock_1.instance(context))).rejects.toEqual(new npm_error_1.NpmError("E404", "Not Found", error))];
                    case 1:
                        _b.sent();
                        strong_mock_1.verifyAll();
                        return [2 /*return*/];
                }
            });
        }); });
    });
    describe("getBasicInfo", function () {
        it("should retrieve the info from npm and return it", function () { return __awaiter(void 0, void 0, void 0, function () {
            var _a, execa, npm, context, env, info, result;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = setup(), execa = _a.execa, npm = _a.npm;
                        context = strong_mock_1.mock();
                        env = {
                            NPM_TOKEN: "token",
                        };
                        strong_mock_1.when(context.env).thenReturn(env);
                        strong_mock_1.when(context.cwd).thenReturn("cwd");
                        info = {
                            name: "name",
                            version: "1.0.0",
                            versions: ["1.0.0"],
                        };
                        strong_mock_1.when(execa("npm", ["view", "--json"], {
                            cwd: "cwd",
                            env: env,
                        })).thenResolve({
                            stdout: JSON.stringify(info),
                        });
                        return [4 /*yield*/, npm.getBasicInfo(strong_mock_1.instance(context))];
                    case 1:
                        result = _b.sent();
                        strong_mock_1.verifyAll();
                        expect(result).toEqual(info);
                        return [2 /*return*/];
                }
            });
        }); });
    });
    describe("getConfig", function () {
        it("should return the npm config", function () { return __awaiter(void 0, void 0, void 0, function () {
            var _a, execa, npm, context, env, logger, config, result;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = setup(), execa = _a.execa, npm = _a.npm;
                        context = strong_mock_1.mock();
                        env = {
                            NPM_TOKEN: "token",
                        };
                        logger = strong_mock_1.mock();
                        strong_mock_1.when(context.env).thenReturn(env);
                        strong_mock_1.when(context.cwd).thenReturn("cwd");
                        strong_mock_1.when(context.logger).thenReturn(strong_mock_1.instance(logger));
                        config = {
                            registry: "https://registry.npmjs.org",
                        };
                        strong_mock_1.when(execa("npm", ["config", "list", "--json"], {
                            cwd: "cwd",
                            env: env,
                        })).thenResolve({
                            stdout: JSON.stringify(config),
                        });
                        strong_mock_1.when(logger.log("Registry used:", "https://registry.npmjs.org")).thenReturn(undefined);
                        return [4 /*yield*/, npm.getConfig(strong_mock_1.instance(context))];
                    case 1:
                        result = _b.sent();
                        strong_mock_1.verifyAll();
                        expect(result).toEqual(config);
                        return [2 /*return*/];
                }
            });
        }); });
    });
});
