diff --git a/go.mod b/go.mod index 8a6ca08..dfe5d47 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,11 @@ module ddServer go 1.21.4 + +require github.com/stretchr/testify v1.8.4 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fa4b6e6 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..d3acb55 --- /dev/null +++ b/main_test.go @@ -0,0 +1,176 @@ +package main + +import ( + "ddServer/handlers" + "log" + "net/http" + "net/http/httptest" + "net/url" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMain(t *testing.T) { + // Test case 1: Check if the root route ("/") returns the expected response. + t.Run("Root Route", func(t *testing.T) { + req, _ := http.NewRequest("GET", "/", nil) + rr := httptest.NewRecorder() + handler := http.HandlerFunc(handlers.FormHandler(content, &Monsters)) + handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + }) + + // Test case 2: Check if the "/submit" route returns the expected response. + t.Run("Submit Route", func(t *testing.T) { + dir, err := filepath.Abs("test_data") + if err != nil { + log.Fatal(err) + } + + filename := filepath.Join(dir, "monster.json") + EnsureDirExists(dir) + + formData := url.Values{ + "filename": {filename}, + "name": {"Monster Name"}, + "source": {"Monster Source"}, + "size": {"Monster Size"}, + "type": {"Monster Type"}, + "alignment": {"Monster Alignment"}, + "ac": {"15"}, // Beispielwert für AC + "acFrom": {"Natural Armor"}, // Beispielwert für AC From + "hpAverage": {"30"}, // Beispielwert für HP Average + "hpFormula": {"2d10+5"}, // Beispielwert für HP Formula + "speed": {"30"}, // Beispielwert für Speed + "str": {"16"}, // Beispielwert für Str + "dex": {"14"}, // Beispielwert für Dex + "con": {"18"}, // Beispielwert für Con + "int": {"10"}, // Beispielwert für Int + "wis": {"12"}, // Beispielwert für Wis + "cha": {"8"}, // Beispielwert für Cha + "saveDex": {"+2"}, // Beispielwert für Save Dex + "saveCon": {"+4"}, // Beispielwert für Save Con + "saveWis": {"+1"}, // Beispielwert für Save Wis + "perception": {"+3"}, // Beispielwert für Perception + "stealth": {"+2"}, // Beispielwert für Stealth + "damageRes": {"Fire, Cold"}, // Beispielwert für Damage Resistances + "senses": {"Darkvision"}, // Beispielwert für Senses + "languages": {"Common"}, // Beispielwert für Languages + "cr": {"2"}, // Beispielwert für CR + "traitName": {"Trait Name"}, // Beispielwert für Trait Name + "traitEntry": {"Trait Entry"}, // Beispielwert für Trait Entry + "actionName": {"Action Name"}, // Beispielwert für Action Name + "actionEntry": {"Action Entry"}, // Beispielwert für Action Entry + } + + log.Println("Writing data to file:", filename) + + req, _ := http.NewRequest("POST", "/submit", strings.NewReader(formData.Encode())) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(handlers.SubmitHandler(content, &chars, &Monsters, filename)) + handler.ServeHTTP(rr, req) + + assert.Equal(t, http.StatusOK, rr.Code) + }) + + // Test case 3: Check if the "/images/" route returns the expected response. + t.Run("Images Route", func(t *testing.T) { + req, _ := http.NewRequest("GET", "/images/", nil) + rr := httptest.NewRecorder() + handler := http.StripPrefix("/images/", http.FileServer(http.FS(content))) + handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + }) + + // Test case 4: Check if the "/addMonster" route returns the expected response. + t.Run("AddMonster Route", func(t *testing.T) { + dir, err := filepath.Abs("test_data") + if err != nil { + log.Fatal(err) + } + + filename := filepath.Join(dir, "monster.json") + EnsureDirExists(dir) + formData := url.Values{ + "filename": {filename}, + "name": {"Monster Name"}, + "source": {"Monster Source"}, + "size": {"Monster Size"}, + "type": {"Monster Type"}, + "alignment": {"Monster Alignment"}, + "ac": {"15"}, // Beispielwert für AC + "acFrom": {"Natural Armor"}, // Beispielwert für AC From + "hpAverage": {"30"}, // Beispielwert für HP Average + "hpFormula": {"2d10+5"}, // Beispielwert für HP Formula + "speed": {"30"}, // Beispielwert für Speed + "str": {"16"}, // Beispielwert für Str + "dex": {"14"}, // Beispielwert für Dex + "con": {"18"}, // Beispielwert für Con + "int": {"10"}, // Beispielwert für Int + "wis": {"12"}, // Beispielwert für Wis + "cha": {"8"}, // Beispielwert für Cha + "saveDex": {"+2"}, // Beispielwert für Save Dex + "saveCon": {"+4"}, // Beispielwert für Save Con + "saveWis": {"+1"}, // Beispielwert für Save Wis + "perception": {"+3"}, // Beispielwert für Perception + "stealth": {"+2"}, // Beispielwert für Stealth + "damageRes": {"Fire, Cold"}, // Beispielwert für Damage Resistances + "senses": {"Darkvision"}, // Beispielwert für Senses + "languages": {"Common"}, // Beispielwert für Languages + "cr": {"2"}, // Beispielwert für CR + "traitName": {"Trait Name"}, // Beispielwert für Trait Name + "traitEntry": {"Trait Entry"}, // Beispielwert für Trait Entry + "actionName": {"Action Name"}, // Beispielwert für Action Name + "actionEntry": {"Action Entry"}, // Beispielwert für Action Entry + } + req, _ := http.NewRequest("POST", "/addMonster", strings.NewReader(formData.Encode())) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(handlers.SubmitHandler(content, &chars, &Monsters, filename)) + handler.ServeHTTP(rr, req) + + assert.Equal(t, http.StatusOK, rr.Code) + }) + + // Test case 5: Check if the "/main" route returns the expected response. + t.Run("Main Route", func(t *testing.T) { + req, _ := http.NewRequest("GET", "/main", nil) + rr := httptest.NewRecorder() + handler := http.HandlerFunc(handlers.MainHandler(content, &Monsters)) + handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + }) + + // Test case 6: Check if the "/about" route returns the expected response. + t.Run("About Route", func(t *testing.T) { + req, _ := http.NewRequest("GET", "/about", nil) + rr := httptest.NewRecorder() + handler := http.HandlerFunc(handlers.AboutHandler(content)) + handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + }) + + // Test case 7: Check if the "/contact" route returns the expected response. + t.Run("Contact Route", func(t *testing.T) { + req, _ := http.NewRequest("GET", "/contact", nil) + rr := httptest.NewRecorder() + handler := http.HandlerFunc(handlers.ContactHandler(content)) + handler.ServeHTTP(rr, req) + assert.Equal(t, http.StatusOK, rr.Code) + }) +} + +func EnsureDirExists(dir string) error { + err := os.MkdirAll(dir, os.ModePerm) + if err != nil { + log.Println("Error creating directory:", err) + } + return err +}