package web import ( "io/fs" "testing" ) // Стык вшивания с раздачей проверяется здесь, и только здесь: проверки самой // раздачи получают файловую систему параметром и подставляют свою, поэтому // расхождение объявленной раскладки с настоящей им недоступно по построению. // // Раскладка объявлена дважды — выходным каталогом сборщика и `distDir` здесь, — // и связаны они только совпадением строк. Разойдясь, они дают `503` на каждом // пути показа при зелёном наборе проверок. func TestDistMatchesEmbeddedLayout(t *testing.T) { dist, built := Dist() if dist == nil { t.Fatal("вшитое поддерево недоступно: distDir разошёлся с директивой go:embed") } _, err := fs.Stat(dist, "index.html") // Оба исхода законны и различаются одним: собрано приложение или нет. // Незаконно третье — «собрано, но `Dist` этого не видит». if built && err != nil { t.Fatalf("приложение объявлено собранным, а разметки в поддереве нет: %v", err) } if !built && err == nil { t.Fatal("разметка есть, а приложение объявлено несобранным") } if !built { t.Skip("приложение не собрано: прогон без шага сборки, проверять нечего") } } // Метка пустого каталога вшивается вместе с прочим: без неё каталога не было бы // в git, и сборка Go отказывала бы у всякого, кто приложение ни разу не собирал. // Приставка `all:` заведена ровно ради неё. func TestMarkerIsEmbedded(t *testing.T) { if _, err := fs.Stat(embedded, "embed/.gitkeep"); err != nil { t.Fatalf("метка пустого каталога не вшита: %v", err) } }