Bei Firmenanlage (Registrierung + Betreiber-Firmenanlage) müssen jetzt Adresse (Straße, PLZ, Ort, Land) und Abrechnungsdaten (Rechnungsemail, optional USt-IdNr.) erfasst werden, nicht nur der Firmenname (Migration 0023). USt-IdNr. bewusst optional - Kleinunternehmer nach §19 UStG haben keine. Neue Seite /verwaltung/firma (admin-only) zum Einsehen/ Nachtragen für bestehende Firmen. store.CreateAccount nimmt jetzt ein AccountInput statt nur einen Namen entgegen (Signaturänderung betrifft ~20 Testaufrufe, mechanisch umgestellt). register.html/ betreiber_account_neu.html auf form-card/form-grid umgestellt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
88 lines
3.0 KiB
Go
88 lines
3.0 KiB
Go
package web_test
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestRegisterRequiresFirmenadresse(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
|
|
resp := postForm(t, s, nil, "/register", url.Values{
|
|
"account_name": {"Unvollständig GmbH"}, "email": {"unvollstaendig@example.com"}, "password": {"ein-sicheres-passwort"},
|
|
// Adresse/Rechnungsemail fehlen bewusst.
|
|
})
|
|
if resp.Code != http.StatusOK {
|
|
t.Fatalf("status = %d, want 200 (Formular mit Fehler)", resp.Code)
|
|
}
|
|
if !strings.Contains(resp.Body.String(), "Pflicht") {
|
|
t.Fatalf("erwartet Validierungsfehler, body: %s", resp.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestRegisterSpeichertFirmendaten(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
|
|
resp := postForm(t, s, nil, "/register", mergeValues(url.Values{
|
|
"account_name": {"Vollständig GmbH"}, "email": {"admin@vollstaendig.example.com"}, "password": {"ein-sicheres-passwort"},
|
|
}, firmenPflichtfelder()))
|
|
if resp.Code != http.StatusSeeOther {
|
|
t.Fatalf("status = %d, want 303, body: %s", resp.Code, resp.Body.String())
|
|
}
|
|
|
|
user, err := fs.GetUserByEmail(context.Background(), "admin@vollstaendig.example.com")
|
|
if err != nil {
|
|
t.Fatalf("GetUserByEmail: %v", err)
|
|
}
|
|
acc, err := fs.GetAccount(context.Background(), user.AccountID)
|
|
if err != nil {
|
|
t.Fatalf("GetAccount: %v", err)
|
|
}
|
|
if acc.Strasse != "Teststraße 1" || acc.PLZ != "12345" || acc.Rechnungsemail != "rechnung@example.com" {
|
|
t.Fatalf("Account = %+v, Firmendaten nicht wie erwartet gespeichert", acc)
|
|
}
|
|
}
|
|
|
|
func TestAdminKannFirmendatenBearbeiten(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
cookie := seedAccountWithRole(t, fs, "Alte Firma", "admin@example.com", "admin")
|
|
|
|
getResp := getWithCookie(t, s, cookie, "/verwaltung/firma")
|
|
if getResp.Code != http.StatusOK {
|
|
t.Fatalf("GET status = %d, want 200", getResp.Code)
|
|
}
|
|
if !strings.Contains(getResp.Body.String(), "Alte Firma") {
|
|
t.Fatalf("erwartet aktuellen Firmennamen im Formular, body: %s", getResp.Body.String())
|
|
}
|
|
|
|
saveResp := postForm(t, s, cookie, "/verwaltung/firma", url.Values{
|
|
"account_name": {"Neue Firma"}, "strasse": {"Neue Straße 5"}, "plz": {"99999"}, "ort": {"Neustadt"},
|
|
"land": {"Deutschland"}, "rechnungsemail": {"buchhaltung@neue-firma.example.com"},
|
|
})
|
|
if saveResp.Code != http.StatusSeeOther {
|
|
t.Fatalf("save status = %d, want 303, body: %s", saveResp.Code, saveResp.Body.String())
|
|
}
|
|
|
|
afterResp := getWithCookie(t, s, cookie, "/verwaltung/firma")
|
|
if !strings.Contains(afterResp.Body.String(), "Neue Firma") || !strings.Contains(afterResp.Body.String(), "Neustadt") {
|
|
t.Fatalf("gespeicherte Firmendaten fehlen, body: %s", afterResp.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestNichtAdminKannFirmendatenNichtBearbeiten(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
cookie := seedAccountWithRole(t, fs, "Test-Mandant", "mitarbeiter@example.com", "mitarbeiter")
|
|
|
|
resp := getWithCookie(t, s, cookie, "/verwaltung/firma")
|
|
if resp.Code != http.StatusNotFound {
|
|
t.Fatalf("status = %d, want 404", resp.Code)
|
|
}
|
|
}
|