Files
Bridge-and-Join-s/internal/lkgateway/nocounter_test.go
T

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)
}
}