Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions appTodo.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ func (h FuncHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}

var userAuth = web.TokenInfo{
CookieName: web.COOKIE_NAME,
PrivateKey: web.SECRET_KEY,
CookieName: web.CookieName,
PrivateKey: web.SecretKey,
Auth: web.Auth{
Name: "user",
IsRequired: true,
Expand All @@ -36,17 +36,21 @@ func main() {
modhandler := FuncHandler{HandlerFunc: web.HandleModifyTodo}
todoshandler := FuncHandler{HandlerFunc: web.HandleGetTodos}

cfg := config.GetConfig()
cfg, err := config.GetConfig()
if err != nil {
log.Fatal(err)
}

msql, err := data.OpenDb(cfg)
msql, err := data.OpenDB(&cfg)
if err != nil {
log.Fatal(err)
}
defer data.CloseDb()

err = todos.Init(msql)
if err != nil {
log.Fatal(err)
}

err = users.Init(msql)
if err != nil {
log.Fatal(err)
Expand All @@ -62,5 +66,9 @@ func main() {
http.HandleFunc("/login", web.HandleLogin)
http.HandleFunc("/logout", web.HandleLogout)

http.ListenAndServe(cfg.Port, nil)
err = http.ListenAndServe(cfg.Port, nil)
if err != nil {
log.Fatal(err)
}
defer data.CloseDB()
}
4 changes: 4 additions & 0 deletions cli/.cfg/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"email": "clem@calia.com",
"mdp": "123456"
}
3 changes: 3 additions & 0 deletions cli/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
To use the binary CLI :

In your terminal from webstack/cli, execute the installer with root privileges : sudo ./install.sh
42 changes: 42 additions & 0 deletions cli/cmd/add.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package cmd

import (
"fmt"
"os"
"strconv"
"webstack/metier/todos"
"webstack/metier/users"
)

const AddArgsLen = 4

func Add(user users.User) {
if len(os.Args) != AddArgsLen {
Help("add")
return
}

text := os.Args[2]

priority, err := strconv.Atoi(os.Args[3])
if err != nil {
fmt.Println(InvArgs)
Help("add")

return
}

task, err := todos.NewTask(text)
if err != nil {
fmt.Println(err.Error())
return
}

_, err = todos.Add(task, priority, user)
if err != nil {
fmt.Println(err.Error())
return
}

Get(user)
}
286 changes: 286 additions & 0 deletions cli/cmd/cmd_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,286 @@
package cmd

import (
"bytes"
"fmt"
"io"
"os"
"strings"
"testing"
"webstack/metier/todos"
"webstack/metier/users"
)

type fakeDb struct {
todos []todos.Todo
users []users.User
}

func (f *fakeDb) AddUserDb(u users.User) error {
for _, user := range f.users {
if users.GetEmail(user) == users.GetEmail(u) {
return fmt.Errorf("email déjà utilisé")
}
}

f.users = append(f.users, u)

return nil
}
func (f *fakeDb) GetUser(u users.User) (users.User, error) {
for _, user := range f.users {
fmt.Print(user)

if users.GetEmail(user) == users.GetEmail(u) {
return user, nil
}
}

return users.User{}, fmt.Errorf("error")
}

func (f *fakeDb) AddTodoDb(td todos.Todo, u users.User) error {
f.todos = append(f.todos, td)
return nil
}
func (f *fakeDb) DeleteTodoDb(td todos.Todo) error {
for i, t := range f.todos {
if t.ID == td.ID {
f.todos = append(f.todos[:i], f.todos[i+1:]...)
return nil
}
}

return nil
}
func (f *fakeDb) ModifyTodoDb(td todos.Todo) error {
for _, t := range f.todos {
if t.ID == td.ID {
t.Task = td.Task
return nil
}
}

return nil
}
func (f *fakeDb) GetTodosDb(u users.User) (t []todos.Todo, e error) {
t = f.todos
return t, nil
}

var user users.User

func setupFakeDb() fakeDb {
db := fakeDb{}

task1, _ := todos.NewTask("Faire les courses")
task2, _ := todos.NewTask("Sortir le chien")
task3, _ := todos.NewTask("(/$-_~+)=")
task4, _ := todos.NewTask("Une chaine très longue mais sans caractères spéciaux, d'ailleurs ma mère me dit toujours que je suis spécial, ça va c'est assez long ? Bon aller on va dire que oui")

mdp, _ := users.HashPassword("123456")
todo1 := todos.Todo{ID: 1, Task: task1, Priority: 3}
todo2 := todos.Todo{ID: 2, Task: task2, Priority: 2}
todo3 := todos.Todo{ID: 3, Task: task3, Priority: 2}
todo4 := todos.Todo{ID: 12, Task: task4, Priority: 1}
user, _ = users.NewUser("clem@caramail.fr", mdp)

db.AddTodoDb(todo1, user)
db.AddTodoDb(todo2, user)
db.AddTodoDb(todo3, user)
db.AddTodoDb(todo4, user)
db.AddUserDb(user)

return db
}

func TestGet(t *testing.T) {
db := setupFakeDb()
err := todos.Init(&db)
err2 := users.Init(&db)

if err != nil || err2 != nil {
t.Fatalf("Expected error to be nil but got : %v / %v", err, err2)
}

old := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

defer func() {
os.Stdout = old
}()
Get(db.users[0])

outCh := make(chan string)
go func() {
var buf bytes.Buffer

_, err = io.Copy(&buf, r)
if err != nil {
t.Errorf("Expected error to be nil but got : %v", err)
}
outCh <- buf.String()
}()

err = w.Close()
if err != nil {
t.Fatalf("Expected error to be nil but got : %v", err)
}

want := todos.GetTask(db.todos[0].Task)
want2 := todos.GetTask(db.todos[1].Task)
actual := <-outCh

if !strings.Contains(actual, want) || !strings.Contains(actual, want2) {
t.Errorf("expected : %s and %s, but got : %s", want, want2, actual)
}
}

func TestAdd(t *testing.T) {
db := setupFakeDb()
err := todos.Init(&db)
err2 := users.Init(&db)

if err != nil || err2 != nil {
t.Fatalf("Expected error to be nil but got : %v / %v", err, err2)
}

var tests = []struct {
name string
entryText string
entryPrio string
want string
}{
{"Cas normal", "Sortir le chien", "2", todos.GetTask(db.todos[1].Task)},
{"Chaîne vide", "", "1", todos.ErrNoText},
{"Caractères spéciaux autorisés", "(/$-_~+)=", "1", todos.GetTask(db.todos[2].Task)},
{"Caractères spéciaux non autorisés", "(/$-_]&[~]%)=", "3", todos.ErrSpecialChar},
{"Plusieurs espaces en entrée", " ", "2", todos.ErrNoText},
{"Chaîne longue", "Une chaine très longue mais sans caractères spéciaux, d'ailleurs ma mère me dit toujours que je suis spécial, ça va c'est assez long ? Bon aller on va dire que oui", "1", todos.GetTask(db.todos[3].Task)},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
os.Args = []string{"go run main.go", "add", tt.entryText, tt.entryPrio}
old := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

defer func() {
os.Stdout = old
}()
Add(db.users[0])
outCh := make(chan string)
go func() {
var buf bytes.Buffer

_, err = io.Copy(&buf, r)
if err != nil {
t.Errorf("Expected error to be nil but got : %v", err)
}
outCh <- buf.String()
}()
err = w.Close()
if err != nil {
t.Fatalf("Expected error to be nil but got : %v", err)
}

actual := <-outCh

if !strings.Contains(actual, tt.want) {
t.Errorf("expected : %s, but got : %s", tt.want, actual)
}
})
}
}

func TestDelete(t *testing.T) {
db := setupFakeDb()
err := todos.Init(&db)
err2 := users.Init(&db)

if err != nil || err2 != nil {
t.Fatalf("Expected error to be nil but got : %v / %v", err, err2)
}

os.Args = []string{"go run main.go", "delete", "2"}
old := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

defer func() {
os.Stdout = old
}()

Delete(db.users[0])

outCh := make(chan string)
go func() {
var buf bytes.Buffer

_, err = io.Copy(&buf, r)
if err != nil {
t.Errorf("Expected error to be nil but got : %v", err)
}
outCh <- buf.String()
}()

err = w.Close()
if err != nil {
t.Fatalf("Expected error to be nil but got : %v", err)
}

dontWant := "Sortir le chien"
actual := <-outCh

if strings.Contains(actual, dontWant) {
t.Errorf("expected : %s, but got : %s", dontWant, actual)
}
}

func TestModify(t *testing.T) {
db := setupFakeDb()
err := todos.Init(&db)
err2 := users.Init(&db)

if err != nil || err2 != nil {
t.Fatalf("Expected error to be nil but got : %v / %v", err, err2)
}

old := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

defer func() {
os.Stdout = old
}()

os.Args = []string{"go run main.go", "modify", "2", "Todo modifié", "1"}
fmt.Println(os.Args)
Modify(db.users[0])

outCh := make(chan string)
go func() {
var buf bytes.Buffer

_, err = io.Copy(&buf, r)
if err != nil {
t.Errorf("Expected error to be nil but got : %v", err)
}
outCh <- buf.String()
fmt.Println(outCh)
}()

err = w.Close()
if err != nil {
t.Fatalf("Expected error to be nil but got : %v", err)
}

want := "Todo modifié"
actual := <-outCh

if !strings.Contains(actual, want) {
t.Errorf("expected : %s, but got : %s", want, actual)
}
}
Loading