Отправка в НРД с подтверждением доставки: ERROR от ИШ — заявка «Не отправлена», без BJ_SENT; «Отправить повторно» тем же GUID; сторож связи ИШ↔НРД по журналу ИШ

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-25 15:57:07 +03:00
parent eecb3b7923
commit c2aaa09fe3
15 changed files with 651 additions and 33 deletions
+29
View File
@@ -4,6 +4,7 @@ import (
"context"
"encoding/base64"
"encoding/json"
"errors"
"io"
"net/http"
"net/http/httptest"
@@ -18,6 +19,10 @@ import (
// Сценарий по DOC/instr-ish-rest-api.pdf раздел 2.5.1.
func TestSendPackageHappyPath(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/api/package/status/123" {
_ = json.NewEncoder(w).Encode(map[string]any{"id": 123, "status": "SENT"})
return
}
if r.URL.Path != "/api/package/CH1/file" {
t.Errorf("неожиданный путь %q", r.URL.Path)
}
@@ -206,3 +211,27 @@ func TestGetPackageBase64InJSON(t *testing.T) {
t.Errorf("decoded = %q, ожидалось %q", body, zipBytes)
}
}
// Пакет принят ИШ, но в НРД не ушёл (контур недоступен) — отправка должна вернуть ошибку.
func TestSendPackageNotDelivered(t *testing.T) {
polls := 0
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, "/api/package/status/") {
polls++
st := map[string]any{"id": 187, "status": "NEW"}
if polls > 1 {
st = map[string]any{"id": 187, "status": "ERROR", "error": "ERRORXML_UPLOAD_FAILED"}
}
_ = json.NewEncoder(w).Encode(st)
return
}
_ = json.NewEncoder(w).Encode(map[string]any{"id": 187})
}))
defer srv.Close()
c := igw.NewClient(srv.URL, igw.WithRetry(0, time.Millisecond))
_, err := c.SendPackage(context.Background(), "CH1", "#M2MTR", []byte("PK"))
var nd *igw.NotDeliveredError
if !errors.As(err, &nd) || nd.PackageID != "187" || nd.Code != "ERRORXML_UPLOAD_FAILED" {
t.Fatalf("ожидалась ошибка доставки, получено %v", err)
}
}