diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2026-06-05 00:17:51 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2026-06-18 16:46:52 +0200 |
| commit | 4a58858d65089395f0e983f2711d0e67323caab6 (patch) | |
| tree | a6cf4474d79763290feb0e4baf04ee1ee817230f | |
| parent | 2a566b05c45d42a248ceb2984c5cf66857dbddc0 (diff) | |
tests: Use ‘match’ when mocking a Hetzner HTTP server.
Using ‘match’ to check requests is more conventional and more concise. It
also avoids relying on Guile-Lib, which is an optional dependency, for its
‘assert’ macro.
* tests/machine/hetzner/http.scm ("hetzner-api-actions-unit")
("hetzner-api-locations-unit")
("hetzner-api-server-types-unit")
("hetzner-api-server-delete-unit")
("hetzner-api-server-enable-rescue-system-unit")
("hetzner-api-server-power-on-unit")
("hetzner-api-server-power-off-unit")
("hetzner-api-server-reboot-unit")
("hetzner-api-ssh-key-create-unit")
("hetzner-api-ssh-key-delete-unit")
("hetzner-api-ssh-keys-unit")
("hetzner-api-primary-ips-unit"): Use ‘match’ instead of ‘cond’ and ‘assert’.
Change-Id: Idf8cb1c11b332ffe780ed83c624dc50484b0db52
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
| -rw-r--r-- | tests/machine/hetzner/http.scm | 172 |
1 files changed, 83 insertions, 89 deletions
diff --git a/tests/machine/hetzner/http.scm b/tests/machine/hetzner/http.scm index 2e7d140c7f9..68dd278655a 100644 --- a/tests/machine/hetzner/http.scm +++ b/tests/machine/hetzner/http.scm | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | ;;; GNU Guix --- Functional package management for GNU | 1 | ;;; GNU Guix --- Functional package management for GNU |
| 2 | ;;; Copyright © 2024 Roman Scherer <roman@burningswell.com> | 2 | ;;; Copyright © 2024 Roman Scherer <roman@burningswell.com> |
| 3 | ;;; Copyright © 2026 Ludovic Courtès <ludo@gnu.org> | ||
| 3 | ;;; | 4 | ;;; |
| 4 | ;;; This file is part of GNU Guix. | 5 | ;;; This file is part of GNU Guix. |
| 5 | ;;; | 6 | ;;; |
| @@ -17,7 +18,6 @@ | |||
| 17 | ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. | 18 | ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>. |
| 18 | 19 | ||
| 19 | (define-module (tests machine hetzner http) | 20 | (define-module (tests machine hetzner http) |
| 20 | #:use-module (debugging assert) | ||
| 21 | #:use-module (gnu machine hetzner http) | 21 | #:use-module (gnu machine hetzner http) |
| 22 | #:use-module (guix build utils) | 22 | #:use-module (guix build utils) |
| 23 | #:use-module (guix tests) | 23 | #:use-module (guix tests) |
| @@ -321,20 +321,21 @@ | |||
| 321 | (let ((actions (list action-create-server-alist action-delete-server-alist))) | 321 | (let ((actions (list action-create-server-alist action-delete-server-alist))) |
| 322 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 322 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 323 | (lambda* (request #:key expected) | 323 | (lambda* (request #:key expected) |
| 324 | (assert (equal? 'GET (hetzner-api-request-method request))) | 324 | (match (list (hetzner-api-request-method request) |
| 325 | (assert (equal? "https://api.hetzner.cloud/v1/actions" | 325 | (hetzner-api-request-url request)) |
| 326 | (hetzner-api-request-url request))) | 326 | (('GET "https://api.hetzner.cloud/v1/actions") |
| 327 | (assert (unspecified? (hetzner-api-request-body request))) | 327 | (and (unspecified? (hetzner-api-request-body request)) |
| 328 | (assert (equal? `(("page" . 1) | 328 | (equal? `(("page" . 1) |
| 329 | ("id" . ,(string-join | 329 | ("id" . ,(string-join |
| 330 | (map (lambda (action) | 330 | (map (lambda (action) |
| 331 | (number->string (assoc-ref action "id"))) | 331 | (number->string (assoc-ref action "id"))) |
| 332 | actions) | 332 | actions) |
| 333 | ","))) | 333 | ","))) |
| 334 | (hetzner-api-request-params request))) | 334 | (hetzner-api-request-params request)) |
| 335 | (hetzner-api-response | 335 | (hetzner-api-response |
| 336 | (body `(("meta" . ,meta-page-alist) | 336 | (body `(("meta" . ,meta-page-alist) |
| 337 | ("actions" . #(,action-create-server-alist ,action-delete-server-alist))))))) | 337 | ("actions" . #(,action-create-server-alist |
| 338 | ,action-delete-server-alist)))))))))) | ||
| 338 | (hetzner-api-actions (hetzner-api) | 339 | (hetzner-api-actions (hetzner-api) |
| 339 | (map (lambda (action) | 340 | (map (lambda (action) |
| 340 | (assoc-ref action "id")) | 341 | (assoc-ref action "id")) |
| @@ -344,28 +345,30 @@ | |||
| 344 | (list location-falkenstein) | 345 | (list location-falkenstein) |
| 345 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 346 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 346 | (lambda* (request #:key expected) | 347 | (lambda* (request #:key expected) |
| 347 | (assert (equal? 'GET (hetzner-api-request-method request))) | 348 | (match (list (hetzner-api-request-method request) |
| 348 | (assert (equal? "https://api.hetzner.cloud/v1/locations" | 349 | (hetzner-api-request-url request)) |
| 349 | (hetzner-api-request-url request))) | 350 | (('GET "https://api.hetzner.cloud/v1/locations") |
| 350 | (assert (unspecified? (hetzner-api-request-body request))) | 351 | (and (unspecified? (hetzner-api-request-body request)) |
| 351 | (assert (equal? '(("page" . 1)) (hetzner-api-request-params request))) | 352 | (equal? '(("page" . 1)) |
| 352 | (hetzner-api-response | 353 | (hetzner-api-request-params request)) |
| 353 | (body `(("meta" . ,meta-page-alist) | 354 | (hetzner-api-response |
| 354 | ("locations" . #(,location-falkenstein-alist))))))) | 355 | (body `(("meta" . ,meta-page-alist) |
| 356 | ("locations" . #(,location-falkenstein-alist)))))))))) | ||
| 355 | (hetzner-api-locations (hetzner-api)))) | 357 | (hetzner-api-locations (hetzner-api)))) |
| 356 | 358 | ||
| 357 | (test-equal "hetzner-api-server-types-unit" | 359 | (test-equal "hetzner-api-server-types-unit" |
| 358 | (list server-type-cpx-11) | 360 | (list server-type-cpx-11) |
| 359 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 361 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 360 | (lambda* (request #:key expected) | 362 | (lambda* (request #:key expected) |
| 361 | (assert (equal? 'GET (hetzner-api-request-method request))) | 363 | (match (list (hetzner-api-request-method request) |
| 362 | (assert (equal? "https://api.hetzner.cloud/v1/server_types" | 364 | (hetzner-api-request-url request)) |
| 363 | (hetzner-api-request-url request))) | 365 | (('GET "https://api.hetzner.cloud/v1/server_types") |
| 364 | (assert (unspecified? (hetzner-api-request-body request))) | 366 | (and (unspecified? (hetzner-api-request-body request)) |
| 365 | (assert (equal? '(("page" . 1)) (hetzner-api-request-params request))) | 367 | (equal? '(("page" . 1)) |
| 366 | (hetzner-api-response | 368 | (hetzner-api-request-params request)) |
| 367 | (body `(("meta" . ,meta-page-alist) | 369 | (hetzner-api-response |
| 368 | ("server_types" . #(,server-type-cpx-11-alist))))))) | 370 | (body `(("meta" . ,meta-page-alist) |
| 371 | ("server_types" . #(,server-type-cpx-11-alist)))))))))) | ||
| 369 | (hetzner-api-server-types (hetzner-api)))) | 372 | (hetzner-api-server-types (hetzner-api)))) |
| 370 | 373 | ||
| 371 | (test-equal "hetzner-api-server-create-unit" | 374 | (test-equal "hetzner-api-server-create-unit" |
| @@ -400,15 +403,12 @@ | |||
| 400 | #(10 17 11 2 1 125 0 32 -1 0 #f) "success") | 403 | #(10 17 11 2 1 125 0 32 -1 0 #f) "success") |
| 401 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 404 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 402 | (lambda* (request #:key expected) | 405 | (lambda* (request #:key expected) |
| 403 | (cond | 406 | (match (list (hetzner-api-request-method request) |
| 404 | ((equal? "https://api.hetzner.cloud/v1/servers/59570198" | 407 | (hetzner-api-request-url request)) |
| 405 | (hetzner-api-request-url request)) | 408 | (('DELETE "https://api.hetzner.cloud/v1/servers/59570198") |
| 406 | (assert (equal? 'DELETE (hetzner-api-request-method request))) | ||
| 407 | (hetzner-api-response | 409 | (hetzner-api-response |
| 408 | (body `(("action" . ,action-delete-server-alist))))) | 410 | (body `(("action" . ,action-delete-server-alist))))) |
| 409 | ((equal? "https://api.hetzner.cloud/v1/actions" | 411 | (('GET "https://api.hetzner.cloud/v1/actions") |
| 410 | (hetzner-api-request-url request)) | ||
| 411 | (assert (equal? 'GET (hetzner-api-request-method request))) | ||
| 412 | (hetzner-api-response | 412 | (hetzner-api-response |
| 413 | (body `(("actions" . ,(vector (cons `("status" . "success") | 413 | (body `(("actions" . ,(vector (cons `("status" . "success") |
| 414 | action-delete-server-alist))) | 414 | action-delete-server-alist))) |
| @@ -419,15 +419,13 @@ | |||
| 419 | action-enable-rescue | 419 | action-enable-rescue |
| 420 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 420 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 421 | (lambda* (request #:key expected) | 421 | (lambda* (request #:key expected) |
| 422 | (cond | 422 | (match (list (hetzner-api-request-method request) |
| 423 | ((equal? "https://api.hetzner.cloud/v1/servers/59570198/actions/enable_rescue" | 423 | (hetzner-api-request-url request)) |
| 424 | (hetzner-api-request-url request)) | 424 | (('POST |
| 425 | (assert (equal? 'POST (hetzner-api-request-method request))) | 425 | "https://api.hetzner.cloud/v1/servers/59570198/actions/enable_rescue") |
| 426 | (hetzner-api-response | 426 | (hetzner-api-response |
| 427 | (body `(("action" . ,action-enable-rescue-alist))))) | 427 | (body `(("action" . ,action-enable-rescue-alist))))) |
| 428 | ((equal? "https://api.hetzner.cloud/v1/actions" | 428 | (('GET "https://api.hetzner.cloud/v1/actions") |
| 429 | (hetzner-api-request-url request)) | ||
| 430 | (assert (equal? 'GET (hetzner-api-request-method request))) | ||
| 431 | (hetzner-api-response | 429 | (hetzner-api-response |
| 432 | (body `(("actions" . ,(vector (cons `("status" . "success") | 430 | (body `(("actions" . ,(vector (cons `("status" . "success") |
| 433 | action-enable-rescue-alist))) | 431 | action-enable-rescue-alist))) |
| @@ -439,15 +437,13 @@ | |||
| 439 | action-power-on | 437 | action-power-on |
| 440 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 438 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 441 | (lambda* (request #:key expected) | 439 | (lambda* (request #:key expected) |
| 442 | (cond | 440 | (match (list (hetzner-api-request-method request) |
| 443 | ((equal? "https://api.hetzner.cloud/v1/servers/59570198/actions/poweron" | 441 | (hetzner-api-request-url request)) |
| 444 | (hetzner-api-request-url request)) | 442 | (('POST |
| 445 | (assert (equal? 'POST (hetzner-api-request-method request))) | 443 | "https://api.hetzner.cloud/v1/servers/59570198/actions/poweron") |
| 446 | (hetzner-api-response | 444 | (hetzner-api-response |
| 447 | (body `(("action" . ,action-power-on-alist))))) | 445 | (body `(("action" . ,action-power-on-alist))))) |
| 448 | ((equal? "https://api.hetzner.cloud/v1/actions" | 446 | (('GET "https://api.hetzner.cloud/v1/actions") |
| 449 | (hetzner-api-request-url request)) | ||
| 450 | (assert (equal? 'GET (hetzner-api-request-method request))) | ||
| 451 | (hetzner-api-response | 447 | (hetzner-api-response |
| 452 | (body `(("actions" . ,(vector (cons `("status" . "success") | 448 | (body `(("actions" . ,(vector (cons `("status" . "success") |
| 453 | action-power-on-alist))) | 449 | action-power-on-alist))) |
| @@ -458,15 +454,13 @@ | |||
| 458 | action-power-off | 454 | action-power-off |
| 459 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 455 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 460 | (lambda* (request #:key expected) | 456 | (lambda* (request #:key expected) |
| 461 | (cond | 457 | (match (list (hetzner-api-request-method request) |
| 462 | ((equal? "https://api.hetzner.cloud/v1/servers/59570198/actions/poweroff" | 458 | (hetzner-api-request-url request)) |
| 463 | (hetzner-api-request-url request)) | 459 | (('POST |
| 464 | (assert (equal? 'POST (hetzner-api-request-method request))) | 460 | "https://api.hetzner.cloud/v1/servers/59570198/actions/poweroff") |
| 465 | (hetzner-api-response | 461 | (hetzner-api-response |
| 466 | (body `(("action" . ,action-power-off-alist))))) | 462 | (body `(("action" . ,action-power-off-alist))))) |
| 467 | ((equal? "https://api.hetzner.cloud/v1/actions" | 463 | (('GET "https://api.hetzner.cloud/v1/actions") |
| 468 | (hetzner-api-request-url request)) | ||
| 469 | (assert (equal? 'GET (hetzner-api-request-method request))) | ||
| 470 | (hetzner-api-response | 464 | (hetzner-api-response |
| 471 | (body `(("actions" . ,(vector (cons `("status" . "success") | 465 | (body `(("actions" . ,(vector (cons `("status" . "success") |
| 472 | action-power-off-alist))) | 466 | action-power-off-alist))) |
| @@ -477,15 +471,13 @@ | |||
| 477 | action-reboot | 471 | action-reboot |
| 478 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 472 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 479 | (lambda* (request #:key expected) | 473 | (lambda* (request #:key expected) |
| 480 | (cond | 474 | (match (list (hetzner-api-request-method request) |
| 481 | ((equal? "https://api.hetzner.cloud/v1/servers/59570198/actions/reboot" | 475 | (hetzner-api-request-url request)) |
| 482 | (hetzner-api-request-url request)) | 476 | (('POST |
| 483 | (assert (equal? 'POST (hetzner-api-request-method request))) | 477 | "https://api.hetzner.cloud/v1/servers/59570198/actions/reboot") |
| 484 | (hetzner-api-response | 478 | (hetzner-api-response |
| 485 | (body `(("action" . ,action-reboot-alist))))) | 479 | (body `(("action" . ,action-reboot-alist))))) |
| 486 | ((equal? "https://api.hetzner.cloud/v1/actions" | 480 | (('GET "https://api.hetzner.cloud/v1/actions") |
| 487 | (hetzner-api-request-url request)) | ||
| 488 | (assert (equal? 'GET (hetzner-api-request-method request))) | ||
| 489 | (hetzner-api-response | 481 | (hetzner-api-response |
| 490 | (body `(("actions" . ,(vector (cons `("status" . "success") | 482 | (body `(("actions" . ,(vector (cons `("status" . "success") |
| 491 | action-reboot-alist))) | 483 | action-reboot-alist))) |
| @@ -505,16 +497,16 @@ | |||
| 505 | ssh-key-root | 497 | ssh-key-root |
| 506 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 498 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 507 | (lambda* (request #:key expected) | 499 | (lambda* (request #:key expected) |
| 508 | (assert (equal? 'POST (hetzner-api-request-method request))) | 500 | (match (list (hetzner-api-request-method request) |
| 509 | (assert (equal? "https://api.hetzner.cloud/v1/ssh_keys" | 501 | (hetzner-api-request-url request)) |
| 510 | (hetzner-api-request-url request))) | 502 | (('POST "https://api.hetzner.cloud/v1/ssh_keys") |
| 511 | (assert (equal? `(("name" . "guix-hetzner-api-test-key") | 503 | (and (equal? `(("name" . "guix-hetzner-api-test-key") |
| 512 | ("public_key" . "ssh-ed25519 ABCAC3NzaC1lZDI1NTE5AAAAIBT3lLYPfOZV9NNrNk0jGCufWmXbFSz+ORxowJdHoSIM") | 504 | ("public_key" . "ssh-ed25519 ABCAC3NzaC1lZDI1NTE5AAAAIBT3lLYPfOZV9NNrNk0jGCufWmXbFSz+ORxowJdHoSIM") |
| 513 | ("labels" . (("a" . "1")))) | 505 | ("labels" . (("a" . "1")))) |
| 514 | (hetzner-api-request-body request))) | 506 | (hetzner-api-request-body request)) |
| 515 | (assert (equal? `() (hetzner-api-request-params request))) | 507 | (null? (hetzner-api-request-params request)) |
| 516 | (hetzner-api-response | 508 | (hetzner-api-response |
| 517 | (body `(("ssh_key" . ,ssh-key-root-alist)))))) | 509 | (body `(("ssh_key" . ,ssh-key-root-alist))))))))) |
| 518 | (hetzner-api-ssh-key-create | 510 | (hetzner-api-ssh-key-create |
| 519 | (hetzner-api) | 511 | (hetzner-api) |
| 520 | "guix-hetzner-api-test-key" | 512 | "guix-hetzner-api-test-key" |
| @@ -524,38 +516,40 @@ | |||
| 524 | (test-assert "hetzner-api-ssh-key-delete-unit" | 516 | (test-assert "hetzner-api-ssh-key-delete-unit" |
| 525 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 517 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 526 | (lambda* (request #:key expected) | 518 | (lambda* (request #:key expected) |
| 527 | (assert (equal? "https://api.hetzner.cloud/v1/ssh_keys/16510983" | 519 | (match (list (hetzner-api-request-method request) |
| 528 | (hetzner-api-request-url request))) | 520 | (hetzner-api-request-url request)) |
| 529 | (assert (equal? 'DELETE (hetzner-api-request-method request))) | 521 | (('DELETE "https://api.hetzner.cloud/v1/ssh_keys/16510983") |
| 530 | (hetzner-api-response))) | 522 | (hetzner-api-response))))) |
| 531 | (hetzner-api-ssh-key-delete (hetzner-api) ssh-key-root))) | 523 | (hetzner-api-ssh-key-delete (hetzner-api) ssh-key-root))) |
| 532 | 524 | ||
| 533 | (test-equal "hetzner-api-ssh-keys-unit" | 525 | (test-equal "hetzner-api-ssh-keys-unit" |
| 534 | (list ssh-key-root) | 526 | (list ssh-key-root) |
| 535 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 527 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 536 | (lambda* (request #:key expected) | 528 | (lambda* (request #:key expected) |
| 537 | (assert (equal? 'GET (hetzner-api-request-method request))) | 529 | (match (list (hetzner-api-request-method request) |
| 538 | (assert (equal? "https://api.hetzner.cloud/v1/ssh_keys" | 530 | (hetzner-api-request-url request)) |
| 539 | (hetzner-api-request-url request))) | 531 | (('GET "https://api.hetzner.cloud/v1/ssh_keys") |
| 540 | (assert (unspecified? (hetzner-api-request-body request))) | 532 | (and (unspecified? (hetzner-api-request-body request)) |
| 541 | (assert (equal? '(("page" . 1)) (hetzner-api-request-params request))) | 533 | (equal? '(("page" . 1)) |
| 542 | (hetzner-api-response | 534 | (hetzner-api-request-params request)) |
| 543 | (body `(("meta" . ,meta-page-alist) | 535 | (hetzner-api-response |
| 544 | ("ssh_keys" . #(,ssh-key-root-alist))))))) | 536 | (body `(("meta" . ,meta-page-alist) |
| 537 | ("ssh_keys" . #(,ssh-key-root-alist)))))))))) | ||
| 545 | (hetzner-api-ssh-keys (hetzner-api)))) | 538 | (hetzner-api-ssh-keys (hetzner-api)))) |
| 546 | 539 | ||
| 547 | (test-equal "hetzner-api-primary-ips-unit" | 540 | (test-equal "hetzner-api-primary-ips-unit" |
| 548 | (list primary-ip) | 541 | (list primary-ip) |
| 549 | (mock ((gnu machine hetzner http) hetzner-api-request-send | 542 | (mock ((gnu machine hetzner http) hetzner-api-request-send |
| 550 | (lambda* (request #:key expected) | 543 | (lambda* (request #:key expected) |
| 551 | (assert (equal? 'GET (hetzner-api-request-method request))) | 544 | (match (list (hetzner-api-request-method request) |
| 552 | (assert (equal? "https://api.hetzner.cloud/v1/primary_ips" | 545 | (hetzner-api-request-url request)) |
| 553 | (hetzner-api-request-url request))) | 546 | (('GET "https://api.hetzner.cloud/v1/primary_ips") |
| 554 | (assert (unspecified? (hetzner-api-request-body request))) | 547 | (and (unspecified? (hetzner-api-request-body request)) |
| 555 | (assert (equal? '(("page" . 1)) (hetzner-api-request-params request))) | 548 | (equal? '(("page" . 1)) |
| 556 | (hetzner-api-response | 549 | (hetzner-api-request-params request)) |
| 557 | (body `(("meta" . ,meta-page-alist) | 550 | (hetzner-api-response |
| 558 | ("primary_ips" . #(,primary-ip-alist))))))) | 551 | (body `(("meta" . ,meta-page-alist) |
| 552 | ("primary_ips" . #(,primary-ip-alist)))))))))) | ||
| 559 | (hetzner-api-primary-ips (hetzner-api)))) | 553 | (hetzner-api-primary-ips (hetzner-api)))) |
| 560 | 554 | ||
| 561 | ;; Integration tests | 555 | ;; Integration tests |
