From 0685042c4601e7e7a88aab9c1cbfbfb4092a5aa2 Mon Sep 17 00:00:00 2001 From: Jelle Licht Date: Sun, 19 May 2024 15:11:46 +0200 Subject: import: Add binary npm importer. * guix/scripts/import.scm: (importers): Add "npm-binary". * doc/guix.texi (Invoking guix import): Document npm-binary importer. * guix/import/npm-binary.scm: New file. * guix/scripts/import/npm-binary.scm: New file. * tests/npm-binary.scm: New file. * Makefile.am: Add them. Co-authored-by: Timothy Sample Co-authored-by: Lars-Dominik Braun Change-Id: I98a45068cf5b9c42790664cc743feaa7ac76f807 --- tests/npm-binary.scm | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100755 tests/npm-binary.scm (limited to 'tests') diff --git a/tests/npm-binary.scm b/tests/npm-binary.scm new file mode 100755 index 0000000000..cf85e572b3 --- /dev/null +++ b/tests/npm-binary.scm @@ -0,0 +1,146 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2024 Jelle Licht +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . +(define-module (test-npm-binary) + #:use-module ((gcrypt hash) + #:select ((sha256 . gcrypt-sha256))) + #:use-module (guix import npm-binary) + #:use-module (guix base32) + #:use-module (guix tests) + #:use-module (srfi srfi-64) + #:use-module (ice-9 iconv) + #:use-module (ice-9 match) + #:export (run-test)) + +(define foo-json + "{ + \"name\": \"foo\", + \"dist-tags\": { + \"latest\": \"1.2.3\", + \"next\": \"2.0.1-beta4\" + }, + \"description\": \"General purpose utilities to foo your bars\", + \"homepage\": \"https://github.com/quartz/foo\", + \"repository\": \"quartz/foo\", + \"versions\": { + \"1.2.3\": { + \"name\": \"foo\", + \"description\": \"General purpose utilities to foo your bars\", + \"version\": \"1.2.3\", + \"author\": \"Jelle Licht \", + \"devDependencies\": { + \"node-megabuilder\": \"^0.0.2\" + }, + \"dependencies\": { + \"bar\": \"^0.1.0\" + }, + \"repository\": { + \"url\": \"quartz/foo\" + }, + \"homepage\": \"https://github.com/quartz/foo\", + \"license\": \"MIT\", + \"dist\": { + \"tarball\": \"https://registry.npmjs.org/foo/-/foo-1.2.3.tgz\" + } + } + } +}") + +(define bar-json + "{ + \"name\": \"bar\", + \"dist-tags\": { + \"latest\": \"0.1.2\" + }, + \"description\": \"Core module in FooBar\", + \"homepage\": \"https://github.com/quartz/bar\", + \"repository\": \"quartz/bar\", + \"versions\": { + \"0.1.2\": { + \"name\": \"bar\", + \"description\": \"Core module in FooBar\", + \"version\": \"0.1.2\", + \"author\": \"Jelle Licht \", + \"repository\": { + \"url\": \"quartz/bar\" + }, + \"homepage\": \"https://github.com/quartz/bar\", + \"license\": \"MIT\", + \"dist\": { + \"tarball\": \"https://registry.npmjs.org/bar/-/bar-0.1.2.tgz\" + } + } + } +}") + +(define test-source-hash + "") + +(define test-source + "Empty file\n") + +(define have-guile-semver? + (false-if-exception (resolve-interface '(semver)))) + +(test-begin "npm") + +(unless have-guile-semver? (test-skip 1)) +(test-assert "npm-binary->guix-package" + (mock ((guix http-client) http-fetch + (lambda* (url #:rest _) + (match url + ("https://registry.npmjs.org/foo" + (values (open-input-string foo-json) + (string-length foo-json))) + ("https://registry.npmjs.org/bar" + (values (open-input-string bar-json) + (string-length bar-json))) + ("https://registry.npmjs.org/foo/-/foo-1.2.3.tgz" + (set! test-source-hash + (bytevector->nix-base32-string + (gcrypt-sha256 (string->bytevector test-source "utf-8")))) + (values (open-input-string test-source) + (string-length test-source)))))) + (match (npm-binary->guix-package "foo") + (`(package + (name "node-foo") + (version "1.2.3") + (source (origin + (method url-fetch) + (uri "https://registry.npmjs.org/foo/-/foo-1.2.3.tgz") + (sha256 + (base32 + ,test-source-hash)))) + (build-system node-build-system) + (arguments + (list #:tests? #f + #:phases + (gexp (modify-phases %standard-phases + (delete 'build) + (add-after 'patch-dependencies 'delete-dev-dependencies + (lambda _ + (delete-dependencies '("node-megabuilder")))))))) + (inputs (list node-bar-0.1.2)) + (home-page "https://github.com/quartz/foo") + (synopsis "General purpose utilities to foo your bars") + (description "General purpose utilities to foo your bars") + (license license:expat)) + #t) + (x + (pk 'fail x #f))))) + +(test-end "npm") -- cgit v1.2.3