diff --git a/.envTest b/.envTest new file mode 100644 index 0000000..25766b1 --- /dev/null +++ b/.envTest @@ -0,0 +1 @@ +PORT=6543 \ No newline at end of file diff --git a/controller/controller_test.go b/controller/controller_test.go new file mode 100644 index 0000000..68e2bc1 --- /dev/null +++ b/controller/controller_test.go @@ -0,0 +1,22 @@ +package controller + +import ( + "io" + "net/http" + "testing" + + "github.com/rjNemo/go-wiki/service" +) + +func TestParseContactForm(t *testing.T) { + var i io.Reader + r, err := http.NewRequest(http.MethodPost, "/contact/post/", i) + if err != nil { + t.Errorf("%s", err) + } + ans := parseContactForm(r) + if ans != service.NewMail("", "") { + t.Errorf("parseContactForm(r) = %v", ans) + } + +} diff --git a/controller/router.go b/controller/router.go index 6a18464..ddbee17 100644 --- a/controller/router.go +++ b/controller/router.go @@ -8,6 +8,7 @@ import ( "github.com/rjNemo/go-wiki/model" "github.com/rjNemo/go-wiki/service" + "github.com/rjNemo/go-wiki/settings" ) // func ParseTemplates() *template.Template { @@ -21,7 +22,7 @@ func Router() { http.HandleFunc("/edit/", makeHandler(editHandler)) http.HandleFunc("/save/", makeHandler(saveHandler)) http.HandleFunc("/contact/", contactHandler) - http.HandleFunc("/contact/post", postContactHandler) + http.HandleFunc("/contact/post/", postContactHandler) http.HandleFunc("/", homeHandler) } @@ -68,7 +69,7 @@ func postContactHandler(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() checkError(err, w) // bad error handling mail := parseContactForm(r) - service.MailClient(mail) + mail.Send() fmt.Println(mail) renderTemplate(w, "contact_sent", nil) } @@ -88,7 +89,7 @@ func renderTemplate(w http.ResponseWriter, tmpl string, p *model.Page) { } func getTmplName(tmpl string) string { - return tmplDir + tmpl + ".html" + return settings.TmplDir + tmpl + ".html" } func checkError(err error, w http.ResponseWriter) { diff --git a/controller/settings.go b/controller/settings.go deleted file mode 100644 index a8fa7fe..0000000 --- a/controller/settings.go +++ /dev/null @@ -1,24 +0,0 @@ -package controller - -import ( - "log" - "os" - - "github.com/joho/godotenv" -) - -// Port value -var Port string = readEnv(".env") -var tmplDir string = "templates/" - -func readEnv(f string) string { - err := godotenv.Load(".env") - if err != nil { - log.Fatal("Error loading .env file") - } - port := os.Getenv("PORT") - if port == "" { - log.Fatal("PORT must be set") - } - return port -} diff --git a/go-wiki b/go-wiki new file mode 100755 index 0000000..6f7780c Binary files /dev/null and b/go-wiki differ diff --git a/main.go b/main.go index 373fd59..f2d8f9e 100644 --- a/main.go +++ b/main.go @@ -3,19 +3,34 @@ package main import ( "log" "net/http" + "os" + "github.com/joho/godotenv" "github.com/rjNemo/go-wiki/controller" - "github.com/rjNemo/go-wiki/service" + "github.com/rjNemo/go-wiki/settings" ) +var port string = readEnv(settings.EnvFile) + func main() { - service.PaymentIntent(1000, "ruidy.nemausat@gmail.com") - startServer(controller.Port, controller.Router) + startServer(port, controller.Router) } func startServer(p string, r func()) { - log.Printf("Start Go-wiki server on http://localhost:%s\n", controller.Port) + log.Printf("Start Go-wiki server on http://localhost:%s\n", port) port := ":" + p r() log.Fatal(http.ListenAndServe(port, nil)) } + +func readEnv(f string) string { + err := godotenv.Load(f) + if err != nil { + log.Fatal("Error loading .env file") + } + port := os.Getenv("PORT") + if port == "" { + log.Fatal("PORT must be set. Consider verify your EnvFile.") + } + return port +} diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..2d8e2ac --- /dev/null +++ b/main_test.go @@ -0,0 +1,20 @@ +package main + +import ( + "os" + "testing" +) + +func TestReadEnv(t *testing.T) { + e, err := os.Create(".envTest") + if err != nil { + t.Errorf("Error creating file %s", err) + } + e.Write([]byte("PORT=6543")) + defer e.Close() + + ans := readEnv(".envTest") + if ans != "6543" { + t.Errorf("readEnv('.envTest') = %s ; want 6543", ans) + } +} diff --git a/model/page.go b/model/page.go index 7602bd4..66e2e8a 100644 --- a/model/page.go +++ b/model/page.go @@ -10,6 +10,26 @@ type Page struct { body []byte } +// Title exposes Page's title field +func (p Page) Title() string { + return p.title +} + +// SetTitle edits Page's title field +func (p *Page) SetTitle(s string) { + p.title = s +} + +// Body exposes Page's body field +func (p Page) Body() []byte { + return p.body +} + +// SetBody edits Page's body field +func (p *Page) SetBody(b []byte) { + p.body = b +} + // BlankPage constructor returns a pointer to a blank Page. func BlankPage() *Page { return &Page{title: "Empty page", body: []byte("Write some content")} diff --git a/service/mail.go b/service/mail.go index 3455952..d1baf43 100644 --- a/service/mail.go +++ b/service/mail.go @@ -14,6 +14,13 @@ type Mail struct { message string } +// Sender objects implements Send() method +type Sender interface { + Send() +} + +var _ Sender = &Mail{} // verifies if Mail implements Sender + var hostMail string = "ruidy.nemausat@gmail.com" var smtpServer string = "smtp.gmail.com:587" @@ -22,8 +29,8 @@ func NewMail(from, body string) Mail { return Mail{from, body} } -// MailClient runs a mail client and send mail -func MailClient(m Mail) { +// Send runs a mail client and send mail +func (m *Mail) Send() { c, err := smtp.Dial(smtpServer) if err != nil { log.Fatal(err) diff --git a/service/payment.go b/service/payment.go index 58cfc86..7b418cf 100644 --- a/service/payment.go +++ b/service/payment.go @@ -8,6 +8,8 @@ import ( // secret API key var secretKey string = "sk_test_dyp7eLEq2KnxpWE0qIMihTYZ" +// service.PaymentIntent(1000, "ruidy.nemausat@gmail.com") + // PaymentIntent creates a payment intent func PaymentIntent(a int64, m string) (*stripe.PaymentIntent, error) { stripe.Key = secretKey diff --git a/settings/settings.go b/settings/settings.go new file mode 100644 index 0000000..9aa13e0 --- /dev/null +++ b/settings/settings.go @@ -0,0 +1,7 @@ +package settings + +// EnvFile must be set to the address of the main .env file. +const EnvFile string = ".env" + +// TmplDir must be set to the address of the templates folder. +const TmplDir string = "templates/"