Skip to content
Merged
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
118 changes: 118 additions & 0 deletions 3layerarch/c.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
mode: set
3layerarch/main.go:21.13,23.16 2 0
3layerarch/main.go:23.16,25.3 1 0
3layerarch/main.go:26.2,26.15 1 0
3layerarch/main.go:26.15,27.36 1 0
3layerarch/main.go:27.36,29.4 1 0
3layerarch/main.go:33.2,39.16 2 0
3layerarch/main.go:39.16,41.3 1 0
3layerarch/main.go:44.2,48.16 2 0
3layerarch/main.go:48.16,50.3 1 0
3layerarch/main.go:53.2,82.33 15 0
3layerarch/handler/task/handler.go:25.40,27.2 1 1
3layerarch/handler/task/handler.go:29.70,31.34 2 1
3layerarch/handler/task/handler.go:31.34,34.3 2 1
3layerarch/handler/task/handler.go:35.2,36.49 2 1
3layerarch/handler/task/handler.go:36.49,39.3 2 1
3layerarch/handler/task/handler.go:40.2,40.48 1 1
3layerarch/handler/task/handler.go:40.48,43.3 2 0
3layerarch/handler/task/handler.go:44.2,44.35 1 1
3layerarch/handler/task/handler.go:47.67,49.17 2 1
3layerarch/handler/task/handler.go:49.17,52.3 2 1
3layerarch/handler/task/handler.go:53.2,54.16 2 1
3layerarch/handler/task/handler.go:54.16,57.3 2 1
3layerarch/handler/task/handler.go:58.2,59.16 2 1
3layerarch/handler/task/handler.go:59.16,62.3 2 1
3layerarch/handler/task/handler.go:63.2,64.38 2 1
3layerarch/handler/task/handler.go:64.38,66.3 1 0
3layerarch/handler/task/handler.go:69.69,71.16 2 1
3layerarch/handler/task/handler.go:71.16,74.3 2 0
3layerarch/handler/task/handler.go:75.2,76.38 2 1
3layerarch/handler/task/handler.go:76.38,78.3 1 0
3layerarch/handler/task/handler.go:81.70,83.17 2 1
3layerarch/handler/task/handler.go:83.17,86.3 2 1
3layerarch/handler/task/handler.go:87.2,88.16 2 1
3layerarch/handler/task/handler.go:88.16,91.3 2 1
3layerarch/handler/task/handler.go:92.2,92.49 1 1
3layerarch/handler/task/handler.go:92.49,95.3 2 1
3layerarch/handler/task/handler.go:96.2,96.30 1 1
3layerarch/handler/task/handler.go:99.70,101.17 2 1
3layerarch/handler/task/handler.go:101.17,104.3 2 1
3layerarch/handler/task/handler.go:105.2,106.16 2 1
3layerarch/handler/task/handler.go:106.16,109.3 2 1
3layerarch/handler/task/handler.go:110.2,110.49 1 1
3layerarch/handler/task/handler.go:110.49,113.3 2 1
3layerarch/handler/task/handler.go:114.2,114.30 1 1
3layerarch/handler/user/handler.go:22.40,24.2 1 1
3layerarch/handler/user/handler.go:26.70,28.34 2 1
3layerarch/handler/user/handler.go:28.34,31.3 2 1
3layerarch/handler/user/handler.go:32.2,33.49 2 1
3layerarch/handler/user/handler.go:33.49,36.3 2 1
3layerarch/handler/user/handler.go:37.2,37.48 1 1
3layerarch/handler/user/handler.go:37.48,40.3 2 1
3layerarch/handler/user/handler.go:41.2,41.35 1 1
3layerarch/handler/user/handler.go:44.67,46.17 2 1
3layerarch/handler/user/handler.go:46.17,49.3 2 1
3layerarch/handler/user/handler.go:50.2,51.16 2 1
3layerarch/handler/user/handler.go:51.16,54.3 2 0
3layerarch/handler/user/handler.go:55.2,56.16 2 1
3layerarch/handler/user/handler.go:56.16,59.3 2 0
3layerarch/handler/user/handler.go:60.2,61.38 2 1
3layerarch/handler/user/handler.go:61.38,63.3 1 0
3layerarch/service/task/service.go:28.49,30.2 1 1
3layerarch/service/task/service.go:32.51,35.18 2 1
3layerarch/service/task/service.go:35.18,37.3 1 1
3layerarch/service/task/service.go:39.2,40.16 2 1
3layerarch/service/task/service.go:40.16,42.3 1 1
3layerarch/service/task/service.go:43.2,43.34 1 1
3layerarch/service/task/service.go:46.56,47.13 1 1
3layerarch/service/task/service.go:47.13,49.3 1 1
3layerarch/service/task/service.go:50.2,51.16 2 1
3layerarch/service/task/service.go:51.16,52.27 1 1
3layerarch/service/task/service.go:52.27,54.4 1 1
3layerarch/service/task/service.go:55.3,55.28 1 0
3layerarch/service/task/service.go:57.2,57.18 1 1
3layerarch/service/task/service.go:60.54,62.2 1 1
3layerarch/service/task/service.go:64.44,65.13 1 1
3layerarch/service/task/service.go:65.13,67.3 1 1
3layerarch/service/task/service.go:68.2,69.16 2 1
3layerarch/service/task/service.go:69.16,70.27 1 1
3layerarch/service/task/service.go:70.27,72.4 1 1
3layerarch/service/task/service.go:73.3,73.13 1 0
3layerarch/service/task/service.go:75.2,75.35 1 1
3layerarch/service/task/service.go:78.44,79.13 1 1
3layerarch/service/task/service.go:79.13,81.3 1 1
3layerarch/service/task/service.go:82.2,83.16 2 1
3layerarch/service/task/service.go:83.16,84.27 1 1
3layerarch/service/task/service.go:84.27,86.4 1 1
3layerarch/service/task/service.go:87.3,87.13 1 0
3layerarch/service/task/service.go:89.2,89.35 1 1
3layerarch/service/user/service.go:18.36,20.2 1 1
3layerarch/service/user/service.go:22.51,23.18 1 1
3layerarch/service/user/service.go:23.18,25.3 1 1
3layerarch/service/user/service.go:26.2,26.30 1 1
3layerarch/service/user/service.go:29.56,30.13 1 1
3layerarch/service/user/service.go:30.13,32.3 1 1
3layerarch/service/user/service.go:33.2,34.16 2 1
3layerarch/service/user/service.go:34.16,35.27 1 1
3layerarch/service/user/service.go:35.27,37.4 1 1
3layerarch/service/user/service.go:38.3,38.28 1 1
3layerarch/service/user/service.go:40.2,40.15 1 1
3layerarch/store/user/store.go:12.29,14.2 1 1
3layerarch/store/user/store.go:16.49,19.2 2 1
3layerarch/store/user/store.go:21.54,25.2 3 1
3layerarch/store/task/store.go:13.29,15.2 1 1
3layerarch/store/task/store.go:17.49,20.2 2 1
3layerarch/store/task/store.go:22.54,27.2 3 1
3layerarch/store/task/store.go:29.52,31.16 2 1
3layerarch/store/task/store.go:31.16,33.3 1 0
3layerarch/store/task/store.go:34.2,34.15 1 1
3layerarch/store/task/store.go:34.15,35.38 1 1
3layerarch/store/task/store.go:35.38,37.4 1 0
3layerarch/store/task/store.go:40.2,41.18 2 1
3layerarch/store/task/store.go:41.18,43.76 2 1
3layerarch/store/task/store.go:43.76,45.4 1 0
3layerarch/store/task/store.go:46.3,46.27 1 1
3layerarch/store/task/store.go:48.2,48.19 1 1
3layerarch/store/task/store.go:51.42,54.2 2 1
3layerarch/store/task/store.go:56.42,59.2 2 1
5 changes: 4 additions & 1 deletion 3layerarch/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ module 3layerarch

go 1.24

require github.com/go-sql-driver/mysql v1.9.3
require (
github.com/DATA-DOG/go-sqlmock v1.5.2
github.com/go-sql-driver/mysql v1.9.3
)

require filippo.io/edwards25519 v1.1.0 // indirect
3 changes: 3 additions & 0 deletions 3layerarch/go.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE=
218 changes: 218 additions & 0 deletions 3layerarch/handler/task/handler_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
package taskhandler_test

import (
"bytes"
"encoding/json"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"

"3layerarch/handler/task"
"3layerarch/models"
)

type MockService struct{}

func (m *MockService) CreateTask(t models.Task) error {
if t.Task == "" {
return io.EOF
}
return nil
}

func (m *MockService) GetTask(id int) (models.Task, error) {
if id == 1 {
return models.Task{ID: 1, Task: "Hello", Completed: false, UserID: 1}, nil
}
return models.Task{}, io.EOF
}

func (m *MockService) ViewTasks() ([]models.Task, error) {
return []models.Task{
{ID: 1, Task: "Test 1", Completed: false, UserID: 1},
{ID: 2, Task: "Test 2", Completed: true, UserID: 2},
}, nil
}

func (m *MockService) UpdateTask(id int) error {
if id == 0 {
return io.EOF
}
return nil
}

func (m *MockService) DeleteTask(id int) error {
if id == 0 {
return io.EOF
}
return nil
}

func TestCreateTaskHandler(t *testing.T) {
handler := taskhandler.New(&MockService{})

// Valid Task
task := models.Task{Task: "Test task", UserID: 1}
body, _ := json.Marshal(task)
req := httptest.NewRequest(http.MethodPost, "/task", bytes.NewReader(body))
w := httptest.NewRecorder()
handler.CreateTask(w, req)
if w.Code != http.StatusCreated {
t.Errorf("expected status 201, got %d", w.Code)
}

// Invalid Task (empty body)
req = httptest.NewRequest(http.MethodPost, "/task", bytes.NewReader([]byte{}))
w = httptest.NewRecorder()
handler.CreateTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected status 400 for empty body, got %d", w.Code)
}

// Invalid Task (invalid JSON)
req = httptest.NewRequest(http.MethodPost, "/task", bytes.NewReader([]byte("{invalid json")))
w = httptest.NewRecorder()
handler.CreateTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected status 400 for invalid json, got %d", w.Code)
}
}

func TestGetTaskHandler(t *testing.T) {
handler := taskhandler.New(&MockService{})

// Valid ID
req := httptest.NewRequest(http.MethodGet, "/task/1", nil)
req.SetPathValue("id", "1")
w := httptest.NewRecorder()
handler.GetTask(w, req)
if w.Code != http.StatusOK {
t.Errorf("expected 200 OK, got %d", w.Code)
}
if !strings.Contains(w.Body.String(), "Hello") {
t.Errorf("unexpected response: %s", w.Body.String())
}

// Missing ID
req = httptest.NewRequest(http.MethodGet, "/task/", nil)
req.SetPathValue("id", "")
w = httptest.NewRecorder()
handler.GetTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for missing ID, got %d", w.Code)
}

// Invalid ID format
req = httptest.NewRequest(http.MethodGet, "/task/abc", nil) // Fix here
req.SetPathValue("id", "abc") // Fix here
w = httptest.NewRecorder()
handler.GetTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for invalid ID format, got %d", w.Code)
}

// Not Found
req = httptest.NewRequest(http.MethodGet, "/task/999", nil)
req.SetPathValue("id", "999")
w = httptest.NewRecorder()
handler.GetTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for not found, got %d", w.Code)
}
}

func TestViewTasksHandler(t *testing.T) {
handler := taskhandler.New(&MockService{})

req := httptest.NewRequest(http.MethodGet, "/task", nil)
w := httptest.NewRecorder()
handler.ViewTasks(w, req)
if w.Code != http.StatusOK {
t.Errorf("expected 200 OK, got %d", w.Code)
}
if !strings.Contains(w.Body.String(), "Test 1") || !strings.Contains(w.Body.String(), "Test 2") {
t.Errorf("unexpected tasks list response: %s", w.Body.String())
}
}

func TestUpdateTaskHandler(t *testing.T) {
handler := taskhandler.New(&MockService{})

// Valid ID
req := httptest.NewRequest(http.MethodPut, "/task/1", nil)
req.SetPathValue("id", "1")
w := httptest.NewRecorder()
handler.UpdateTask(w, req)
if w.Code != http.StatusOK {
t.Errorf("expected 200 OK, got %d", w.Code)
}

// Missing ID
req = httptest.NewRequest(http.MethodPut, "/task/", nil)
req.SetPathValue("id", "")
w = httptest.NewRecorder()
handler.UpdateTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for missing ID, got %d", w.Code)
}

// Invalid ID
req = httptest.NewRequest(http.MethodPut, "/task/abc", nil)
req.SetPathValue("id", "abc")
w = httptest.NewRecorder()
handler.UpdateTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for invalid ID, got %d", w.Code)
}

// Error in service for update
req = httptest.NewRequest(http.MethodPut, "/task/0", nil)
req.SetPathValue("id", "0")
w = httptest.NewRecorder()
handler.UpdateTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for update error, got %d", w.Code)
}
}

func TestDeleteTaskHandler(t *testing.T) {
handler := taskhandler.New(&MockService{})

// Valid ID
req := httptest.NewRequest(http.MethodDelete, "/task/1", nil)
req.SetPathValue("id", "1")
w := httptest.NewRecorder()
handler.DeleteTask(w, req)
if w.Code != http.StatusOK {
t.Errorf("expected 200 OK, got %d", w.Code)
}

// Missing ID
req = httptest.NewRequest(http.MethodDelete, "/task/", nil)
req.SetPathValue("id", "")
w = httptest.NewRecorder()
handler.DeleteTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for missing ID, got %d", w.Code)
}

// Invalid ID
req = httptest.NewRequest(http.MethodDelete, "/task/abc", nil)
req.SetPathValue("id", "abc")
w = httptest.NewRecorder()
handler.DeleteTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for invalid ID, got %d", w.Code)
}

// Error in service for delete
req = httptest.NewRequest(http.MethodDelete, "/task/0", nil)
req.SetPathValue("id", "0")
w = httptest.NewRecorder()
handler.DeleteTask(w, req)
if w.Code != http.StatusBadRequest {
t.Errorf("expected 400 for delete error, got %d", w.Code)
}
}
Loading
Loading