a62db0aa0e
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
66 lines
3.1 KiB
Go
66 lines
3.1 KiB
Go
package lkgateway
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// GS036 «об отсутствии встречного поручения» связывается с поручением по референсу строки.
|
|
func TestNoCounterNotice(t *testing.T) {
|
|
at := time.Date(2026, 9, 28, 17, 50, 2, 0, time.Local)
|
|
pkgIndexCache.mu.Lock()
|
|
old, oldAt := pkgIndexCache.list, pkgIndexCache.at
|
|
pkgIndexCache.list = []pkgIndexEntry{
|
|
{dir: "Z2895760", mt: at, body: "<BizSvc>GS036</BizSvc><NtfctnTxt> отсутствии встречного поручения к поручению депо</NtfctnTxt><NtfctnHdr>Референс</NtfctnHdr><NtfctnTxt>M2M20260928HEKR0</NtfctnTxt>"},
|
|
{dir: "K2895751", mt: at, body: "<reg_no>14463891</reg_no><contragent_doc_id>21952</contragent_doc_id>"},
|
|
}
|
|
pkgIndexCache.at = time.Now().Add(time.Hour)
|
|
pkgIndexCache.mu.Unlock()
|
|
defer func() {
|
|
pkgIndexCache.mu.Lock()
|
|
pkgIndexCache.list, pkgIndexCache.at = old, oldAt
|
|
pkgIndexCache.mu.Unlock()
|
|
}()
|
|
|
|
if got, ok := findNoCounterNotice("M2M20260928HEKR0"); !ok || !got.Equal(at) {
|
|
t.Fatalf("уведомление не найдено: %v %v", got, ok)
|
|
}
|
|
if _, ok := findNoCounterNotice("M2M20260928M5XQC"); ok {
|
|
t.Fatal("чужой референс")
|
|
}
|
|
|
|
w := &OrderWatch{Direction: "out", OrderAt: at.Add(-time.Minute), LateAt: at.Add(5 * time.Minute), NoCounterAt: at}
|
|
if s := w.StatusRu(); !strings.Contains(s, "контрагент ещё не подал встречное поручение 16/1") {
|
|
t.Fatalf("ждём встречное: %q", s)
|
|
}
|
|
w.Direction = "in"
|
|
if s := w.StatusRu(); !strings.Contains(s, "поручение 16 передающего") {
|
|
t.Fatalf("входящий: %q", s)
|
|
}
|
|
w.Direction, w.MS010At = "out", at.Add(53*time.Minute)
|
|
if s := w.StatusRu(); !strings.Contains(s, "исполнено") || !strings.Contains(s, "подано не сразу") {
|
|
t.Fatalf("исполнено, встречное не сразу: %q", s)
|
|
}
|
|
// сквитовано через минуту, исполнение НРД через 52 мин — задержка у НРД, не у контрагента
|
|
w.MatchedAt = at.Add(time.Minute)
|
|
if s := w.StatusRu(); strings.Contains(s, "не сразу") || !strings.Contains(s, "сквитовано со встречным в 17:51, исполнение НРД — через 52 мин") {
|
|
t.Fatalf("исполнено после сквитовки: %q", s)
|
|
}
|
|
w.MS010At = time.Time{}
|
|
if s := w.StatusRu(); !strings.Contains(s, "сквитовано со встречным") || !strings.Contains(s, "ждём исполнения НРД") {
|
|
t.Fatalf("сквитовано, ждём: %q", s)
|
|
}
|
|
}
|
|
|
|
// Номер ответа НРД для PARAMETERS — из отчёта MS010 (BizMsgIdr), не из промежуточных документов.
|
|
func TestOrderRespNo(t *testing.T) {
|
|
resps := []orderResponse{{Kind: "GS036", No: "50878765"}, {Kind: "MS010", Done: true, No: "50878767"}}
|
|
if got := orderRespNo(resps); got != "50878767" {
|
|
t.Fatalf("номер ответа: %q", got)
|
|
}
|
|
if got := orderRespNo(resps[:1]); got != "" {
|
|
t.Fatalf("без MS010 — пусто: %q", got)
|
|
}
|
|
}
|