Ograničenje konekcija BE emulatora, sopstveni kontekst fiskalizacije nezavisan od prekida zahteva, validacija porta na setup stranici, serverska optimizacija kratke pretrage bez eval-a, testovi
This commit is contained in:
+24
-13
@@ -45,6 +45,29 @@ func nadjiLokalneAdrese() []string {
|
||||
return adrese
|
||||
}
|
||||
|
||||
// obradiSetupPotvrdi prima izabrani port sa setup stranice, upisuje ntech.env i
|
||||
// signalizira gotov kanalu da server može da se ugasi. Odbija nevažeći JSON i
|
||||
// portove van dozvoljenog opsega (v. BUG.md #38 — ranije se greška dekodiranja
|
||||
// tiho gutala i upisivala port 0).
|
||||
func obradiSetupPotvrdi(envFajl string, gotov chan<- struct{}) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, req *http.Request) {
|
||||
var telo struct {
|
||||
Port int `json:"port"`
|
||||
}
|
||||
if err := json.NewDecoder(req.Body).Decode(&telo); err != nil || telo.Port <= 0 || telo.Port > 65535 {
|
||||
http.Error(w, "Neispravan port", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if err := SacuvajEnv(telo.Port, envFajl); err != nil {
|
||||
http.Error(w, "Greška pri čuvanju podešavanja", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(map[string]bool{"ok": true})
|
||||
close(gotov)
|
||||
}
|
||||
}
|
||||
|
||||
// PokreniSetup pokreće HTTP server za prvo podešavanje i čeka da korisnik završi
|
||||
func PokreniSetup(fsys fs.FS, envFajl string) {
|
||||
port := NadjiSlobodanPort()
|
||||
@@ -86,19 +109,7 @@ func PokreniSetup(fsys fs.FS, envFajl string) {
|
||||
})
|
||||
|
||||
// prima izabrani port, upisuje ntech.env i signalizira završetak
|
||||
r.Post("/setup/potvrdi", func(w http.ResponseWriter, req *http.Request) {
|
||||
var telo struct {
|
||||
Port int `json:"port"`
|
||||
}
|
||||
json.NewDecoder(req.Body).Decode(&telo)
|
||||
if err := SacuvajEnv(telo.Port, envFajl); err != nil {
|
||||
http.Error(w, "Greška pri čuvanju podešavanja", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(map[string]bool{"ok": true})
|
||||
close(gotov)
|
||||
})
|
||||
r.Post("/setup/potvrdi", obradiSetupPotvrdi(envFajl, gotov))
|
||||
|
||||
srv := &http.Server{Addr: adresa, Handler: r}
|
||||
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestObradiSetupPotvrdiNevazeciJsonOdbija(t *testing.T) {
|
||||
envFajl := filepath.Join(t.TempDir(), "ntech.env")
|
||||
gotov := make(chan struct{})
|
||||
|
||||
req := httptest.NewRequest("POST", "/setup/potvrdi", strings.NewReader("nije json"))
|
||||
w := httptest.NewRecorder()
|
||||
obradiSetupPotvrdi(envFajl, gotov)(w, req)
|
||||
|
||||
if w.Code != 400 {
|
||||
t.Fatalf("status = %d, očekivano 400 za nevažeći JSON", w.Code)
|
||||
}
|
||||
if _, err := os.Stat(envFajl); err == nil {
|
||||
t.Fatal("ntech.env ne sme biti upisan kad je JSON nevažeći")
|
||||
}
|
||||
select {
|
||||
case <-gotov:
|
||||
t.Fatal("gotov kanal ne sme biti zatvoren kad zahtev nije uspeo")
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
func TestObradiSetupPotvrdiPortNulaOdbija(t *testing.T) {
|
||||
envFajl := filepath.Join(t.TempDir(), "ntech.env")
|
||||
gotov := make(chan struct{})
|
||||
|
||||
req := httptest.NewRequest("POST", "/setup/potvrdi", strings.NewReader(`{"port":0}`))
|
||||
w := httptest.NewRecorder()
|
||||
obradiSetupPotvrdi(envFajl, gotov)(w, req)
|
||||
|
||||
if w.Code != 400 {
|
||||
t.Fatalf("status = %d, očekivano 400 za port 0", w.Code)
|
||||
}
|
||||
}
|
||||
|
||||
func TestObradiSetupPotvrdiPortVanOpsegaOdbija(t *testing.T) {
|
||||
envFajl := filepath.Join(t.TempDir(), "ntech.env")
|
||||
gotov := make(chan struct{})
|
||||
|
||||
req := httptest.NewRequest("POST", "/setup/potvrdi", strings.NewReader(`{"port":99999}`))
|
||||
w := httptest.NewRecorder()
|
||||
obradiSetupPotvrdi(envFajl, gotov)(w, req)
|
||||
|
||||
if w.Code != 400 {
|
||||
t.Fatalf("status = %d, očekivano 400 za port van opsega", w.Code)
|
||||
}
|
||||
}
|
||||
|
||||
func TestObradiSetupPotvrdiValidanPortUpisuje(t *testing.T) {
|
||||
envFajl := filepath.Join(t.TempDir(), "ntech.env")
|
||||
gotov := make(chan struct{})
|
||||
|
||||
req := httptest.NewRequest("POST", "/setup/potvrdi", strings.NewReader(`{"port":8080}`))
|
||||
w := httptest.NewRecorder()
|
||||
obradiSetupPotvrdi(envFajl, gotov)(w, req)
|
||||
|
||||
if w.Code != 200 {
|
||||
t.Fatalf("status = %d, očekivano 200 za validan port", w.Code)
|
||||
}
|
||||
sadrzaj, err := os.ReadFile(envFajl)
|
||||
if err != nil {
|
||||
t.Fatalf("ntech.env nije upisan: %v", err)
|
||||
}
|
||||
if !strings.Contains(string(sadrzaj), "NTECH_PORT=8080") {
|
||||
t.Errorf("ntech.env sadržaj = %q, očekivano NTECH_PORT=8080", sadrzaj)
|
||||
}
|
||||
select {
|
||||
case <-gotov:
|
||||
default:
|
||||
t.Fatal("gotov kanal mora biti zatvoren posle uspešnog zahteva")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user