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: "GS036 отсутствии встречного поручения к поручению депоРеференсM2M20260928HEKR0"}, {dir: "K2895751", mt: at, body: "1446389121952"}, } 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) } }