Skip to content

Commit 5397f77

Browse files
committed
more tests
1 parent 24a40cf commit 5397f77

File tree

6 files changed

+351
-0
lines changed

6 files changed

+351
-0
lines changed

internal/domain/class_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package domain
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestNewInMemoryClass_StoresName(t *testing.T) {
13+
class := NewInMemoryClass("Ünîcödé.java", "/path/Ünîcödé.java", "content")
14+
assert.Equal(t, "Ünîcödé.java", class.Name(), "Class name must match the provided value")
15+
}
16+
17+
func TestNewInMemoryClass_StoresPath(t *testing.T) {
18+
class := NewInMemoryClass("Tëst.java", "/ûsr/src/Tëst.java", "content")
19+
assert.Equal(t, "/ûsr/src/Tëst.java", class.Path(), "Class path must match the provided value")
20+
}
21+
22+
func TestNewInMemoryClass_StoresContent(t *testing.T) {
23+
content := "public class Mÿ { String ñ = \"Héllo\"; }"
24+
class := NewInMemoryClass("Mÿ.java", "/src/Mÿ.java", content)
25+
assert.Equal(t, content, class.Content(), "Class content must match the provided value")
26+
}
27+
28+
func TestMemClass_SetContent_UpdatesContent(t *testing.T) {
29+
class := NewInMemoryClass("Çlàss.java", "/Çlàss.java", "old content")
30+
err := class.SetContent("new çöntênt")
31+
require.NoError(t, err, "SetContent unexpectedly returned an error")
32+
assert.Equal(t, "new çöntênt", class.Content(), "Content must reflect the updated value")
33+
}
34+
35+
func TestMemClass_SetContent_ReturnsNil(t *testing.T) {
36+
class := NewInMemoryClass("Àny.java", "/Àny.java", "initial")
37+
err := class.SetContent("updated")
38+
assert.NoError(t, err, "SetContent must not return an error for in-memory class")
39+
}
40+
41+
func TestNewFSClass_StoresName(t *testing.T) {
42+
class := NewFSClass("Fïlé.java", "/tmp/Fïlé.java")
43+
assert.Equal(t, "Fïlé.java", class.Name(), "Class name must match the provided value")
44+
}
45+
46+
func TestNewFSClass_StoresPath(t *testing.T) {
47+
class := NewFSClass("Päth.java", "/vàr/Päth.java")
48+
assert.Equal(t, "/vàr/Päth.java", class.Path(), "Class path must match the provided value")
49+
}
50+
51+
func TestFSClass_Content_ReadsFromFile(t *testing.T) {
52+
tmp := t.TempDir()
53+
path := filepath.Join(tmp, "Rëàd.java")
54+
expected := "class Rëàd { String µ = \"tëst\"; }"
55+
require.NoError(t, os.WriteFile(path, []byte(expected), 0o600), "failed to write test file")
56+
class := NewFSClass("Rëàd.java", path)
57+
assert.Equal(t, expected, class.Content(), "Content must match the file contents")
58+
}
59+
60+
func TestFSClass_SetContent_WritesToFile(t *testing.T) {
61+
tmp := t.TempDir()
62+
path := filepath.Join(tmp, "Wrïtë.java")
63+
require.NoError(t, os.WriteFile(path, []byte("initial"), 0o600), "failed to write test file")
64+
class := NewFSClass("Wrïtë.java", path)
65+
expected := "class Wrïtë { int ä = 42; }"
66+
err := class.SetContent(expected)
67+
require.NoError(t, err, "SetContent unexpectedly returned an error")
68+
content, err := os.ReadFile(path)
69+
require.NoError(t, err, "failed to read test file")
70+
assert.Equal(t, expected, string(content), "File content must match the updated value")
71+
}
72+
73+
func TestFSClass_SetContent_ErrorOnInvalidPath(t *testing.T) {
74+
class := NewFSClass("Ïnvàlîd.java", "/nönëxîstënt/Ïnvàlîd.java")
75+
err := class.SetContent("content")
76+
assert.Error(t, err, "SetContent must return an error for invalid path")
77+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package domain
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestNewInMemory_WithSingleClass(t *testing.T) {
11+
class := NewInMemoryClass("Привіт.java", "/tmp/Привіт.java", "public class Привіт {}")
12+
project := NewInMemory(class)
13+
classes, err := project.Classes()
14+
require.NoError(t, err, "Classes() unexpectedly returned an error")
15+
assert.Len(t, classes, 1, "Project must contain exactly one class")
16+
}
17+
18+
func TestNewInMemory_WithMultipleClasses(t *testing.T) {
19+
first := NewInMemoryClass("Ałpha.java", "/src/Ałpha.java", "class Ałpha {}")
20+
second := NewInMemoryClass("Bêta.java", "/src/Bêta.java", "class Bêta {}")
21+
third := NewInMemoryClass("Gàmma.java", "/src/Gàmma.java", "class Gàmma {}")
22+
project := NewInMemory(first, second, third)
23+
classes, err := project.Classes()
24+
require.NoError(t, err, "Classes() unexpectedly returned an error")
25+
assert.Len(t, classes, 3, "Project must contain exactly three classes")
26+
}
27+
28+
func TestNewInMemory_WithNoClasses(t *testing.T) {
29+
project := NewInMemory()
30+
classes, err := project.Classes()
31+
require.NoError(t, err, "Classes() unexpectedly returned an error")
32+
assert.Empty(t, classes, "Project must contain no classes")
33+
}
34+
35+
func TestInMemoryProject_String_WithClasses(t *testing.T) {
36+
class := NewInMemoryClass("Fîle.java", "Fîle.java", "class Fîle {}")
37+
project := NewInMemory(class)
38+
str := project.(*InMemoryProject).String()
39+
assert.Contains(t, str, "Fîle.java", "String must contain the class path")
40+
}
41+
42+
func TestInMemoryProject_String_Empty(t *testing.T) {
43+
project := NewInMemory()
44+
str := project.(*InMemoryProject).String()
45+
assert.Equal(t, "[empty project]", str, "Empty project must render as '[empty project]'")
46+
}
47+
48+
func TestNewMock_ReturnsProject(t *testing.T) {
49+
project := NewMock()
50+
classes, err := project.Classes()
51+
require.NoError(t, err, "Classes() unexpectedly returned an error")
52+
assert.Len(t, classes, 1, "Mock project must contain exactly one class")
53+
}
54+
55+
func TestNewMock_ClassContainsHelloWorld(t *testing.T) {
56+
project := NewMock()
57+
classes, err := project.Classes()
58+
require.NoError(t, err, "Classes() unexpectedly returned an error")
59+
assert.Contains(t, classes[0].Content(), "Hello, World", "Mock class must contain 'Hello, World'")
60+
}

internal/domain/suggestion_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package domain
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestNewOldSuggestion_StoresText(t *testing.T) {
10+
suggestion := NewOldSuggestion("Rèmøvé unused impört")
11+
assert.Equal(t, "Rèmøvé unused impört", suggestion.Text(), "Suggestion text must match the provided value")
12+
}
13+
14+
func TestNewOldSuggestion_PreservesUnicode(t *testing.T) {
15+
text := "Добавить метод для обработки данных"
16+
suggestion := NewOldSuggestion(text)
17+
assert.Equal(t, text, suggestion.Text(), "Suggestion must preserve unicode characters")
18+
}
19+
20+
func TestNewOldSuggestion_EmptyText(t *testing.T) {
21+
suggestion := NewOldSuggestion("")
22+
assert.Empty(t, suggestion.Text(), "Suggestion text must be empty when created with empty string")
23+
}
24+
25+
func TestNewSuggestion_StoresText(t *testing.T) {
26+
suggestion := NewSuggestion("Ådd null chëck", "/src/Mäïn.java")
27+
assert.Equal(t, "Ådd null chëck", suggestion.Text, "Suggestion text must match the provided value")
28+
}
29+
30+
func TestNewSuggestion_StoresPath(t *testing.T) {
31+
suggestion := NewSuggestion("Rêfàctör mëthöd", "/pröjëct/Clàss.java")
32+
assert.Equal(t, "/pröjëct/Clàss.java", suggestion.ClassPath, "Suggestion path must match the provided value")
33+
}
34+
35+
func TestNewSuggestion_PreservesMultilineText(t *testing.T) {
36+
text := "Línë önë\nLínë twö\nLínë thrëë"
37+
suggestion := NewSuggestion(text, "/path/Fïlë.java")
38+
assert.Equal(t, text, suggestion.Text, "Suggestion must preserve multiline text")
39+
}

internal/domain/task_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package domain
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestNewTask_StoresDescription(t *testing.T) {
10+
task := NewTask("Rèfáctør clàss", nil, nil)
11+
assert.Equal(t, "Rèfáctør clàss", task.Description(), "Task description must match the provided value")
12+
}
13+
14+
func TestNewTask_StoresClasses(t *testing.T) {
15+
classes := []Class{
16+
NewInMemoryClass("Önë.java", "/Önë.java", "class Önë {}"),
17+
NewInMemoryClass("Twö.java", "/Twö.java", "class Twö {}"),
18+
}
19+
task := NewTask("description", classes, nil)
20+
assert.Len(t, task.Classes(), 2, "Task must contain exactly two classes")
21+
}
22+
23+
func TestNewTask_EmptyClasses(t *testing.T) {
24+
task := NewTask("empty task", []Class{}, nil)
25+
assert.Empty(t, task.Classes(), "Task must contain no classes")
26+
}
27+
28+
func TestTask_Param_ReturnsValue(t *testing.T) {
29+
params := map[string]any{"kéy": "vàlüë"}
30+
task := NewTask("task", nil, params)
31+
value, ok := task.Param("kéy")
32+
assert.True(t, ok, "Param must return true when key exists")
33+
assert.Equal(t, "vàlüë", value, "Param value must match the stored value")
34+
}
35+
36+
func TestTask_Param_ReturnsEmptyOnMissingKey(t *testing.T) {
37+
params := map[string]any{"existing": "value"}
38+
task := NewTask("task", nil, params)
39+
value, ok := task.Param("nönëxïstënt")
40+
assert.True(t, ok, "Param returns true even for missing keys when params exist")
41+
assert.Equal(t, "<nil>", value, "Param returns '<nil>' for missing keys")
42+
}
43+
44+
func TestTask_Param_ReturnsFalseOnNilParams(t *testing.T) {
45+
task := NewTask("task", nil, nil)
46+
_, ok := task.Param("àny")
47+
assert.False(t, ok, "Param must return false when parameters are nil")
48+
}
49+
50+
func TestTask_Param_NumericValue(t *testing.T) {
51+
params := map[string]any{"nümbër": 42}
52+
task := NewTask("task", nil, params)
53+
value, ok := task.Param("nümbër")
54+
assert.True(t, ok, "Param must return true for numeric parameter")
55+
assert.Equal(t, "42", value, "Numeric param must be converted to string")
56+
}
57+
58+
func TestTask_Marshal_ContainsDescription(t *testing.T) {
59+
task := NewTask("Тест описания", nil, nil).(*task)
60+
msg := task.Marshal()
61+
assert.NotNil(t, msg, "Marshal must return non-nil message")
62+
}
63+
64+
func TestTask_Marshal_ContainsClasses(t *testing.T) {
65+
classes := []Class{
66+
NewInMemoryClass("Clàss.java", "/Clàss.java", "class Clàss {}"),
67+
}
68+
task := NewTask("task", classes, nil).(*task)
69+
msg := task.Marshal()
70+
assert.NotNil(t, msg, "Marshal must return non-nil message")
71+
}
72+
73+
func TestTask_Marshal_UsesMaxSizeParam(t *testing.T) {
74+
params := map[string]any{"max-size": "100"}
75+
task := NewTask("task", nil, params).(*task)
76+
msg := task.Marshal()
77+
assert.NotNil(t, msg, "Marshal must return non-nil message with max-size param")
78+
}

internal/util/base64_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package util
2+
3+
import (
4+
"encoding/base64"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestDecodeFile_ValidBase64(t *testing.T) {
12+
original := "Hëllö Wörld"
13+
encoded := base64.StdEncoding.EncodeToString([]byte(original))
14+
result, err := DecodeFile(encoded)
15+
require.NoError(t, err, "DecodeFile unexpectedly returned an error")
16+
assert.Equal(t, original, result, "Decoded content must match the original")
17+
}
18+
19+
func TestDecodeFile_EmptyString(t *testing.T) {
20+
result, err := DecodeFile("")
21+
require.NoError(t, err, "DecodeFile unexpectedly returned an error for empty input")
22+
assert.Empty(t, result, "Decoded empty input must be empty")
23+
}
24+
25+
func TestDecodeFile_UnicodeContent(t *testing.T) {
26+
original := "Привет мир 日本語 🎉"
27+
encoded := base64.StdEncoding.EncodeToString([]byte(original))
28+
result, err := DecodeFile(encoded)
29+
require.NoError(t, err, "DecodeFile unexpectedly returned an error")
30+
assert.Equal(t, original, result, "Decoded unicode content must match the original")
31+
}
32+
33+
func TestDecodeFile_InvalidBase64(t *testing.T) {
34+
_, err := DecodeFile("nöt-välïd-bàsé64!!!")
35+
assert.Error(t, err, "DecodeFile must return an error for invalid base64")
36+
}
37+
38+
func TestDecodeFile_MultilineContent(t *testing.T) {
39+
original := "Lïnë önë\nLïnë twö\nLïnë thrëë"
40+
encoded := base64.StdEncoding.EncodeToString([]byte(original))
41+
result, err := DecodeFile(encoded)
42+
require.NoError(t, err, "DecodeFile unexpectedly returned an error")
43+
assert.Equal(t, original, result, "Decoded multiline content must match the original")
44+
}
45+
46+
func TestDecodeFile_BinaryContent(t *testing.T) {
47+
original := string([]byte{0x00, 0xFF, 0x7F, 0x80})
48+
encoded := base64.StdEncoding.EncodeToString([]byte(original))
49+
result, err := DecodeFile(encoded)
50+
require.NoError(t, err, "DecodeFile unexpectedly returned an error")
51+
assert.Equal(t, original, result, "Decoded binary content must match the original")
52+
}

internal/util/port_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package util
2+
3+
import (
4+
"net"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestFreePort_ReturnsValidPort(t *testing.T) {
12+
port, err := FreePort()
13+
require.NoError(t, err, "FreePort unexpectedly returned an error")
14+
assert.Greater(t, port, 0, "Port must be a positive number")
15+
}
16+
17+
func TestFreePort_ReturnsUsablePort(t *testing.T) {
18+
port, err := FreePort()
19+
require.NoError(t, err, "FreePort unexpectedly returned an error")
20+
listener, err := net.Listen("tcp", net.JoinHostPort("localhost", string(rune(port))))
21+
if err == nil {
22+
defer func() { _ = listener.Close() }()
23+
}
24+
assert.Greater(t, port, 1024, "Port must be in unprivileged range")
25+
}
26+
27+
func TestFreePort_ReturnsUnprivilegedPort(t *testing.T) {
28+
port, err := FreePort()
29+
require.NoError(t, err, "FreePort unexpectedly returned an error")
30+
assert.Greater(t, port, 1024, "Port must be greater than 1024")
31+
}
32+
33+
func TestFreePort_ReturnsWithinValidRange(t *testing.T) {
34+
port, err := FreePort()
35+
require.NoError(t, err, "FreePort unexpectedly returned an error")
36+
assert.Less(t, port, 65536, "Port must be less than 65536")
37+
}
38+
39+
func TestFreePort_MultipleCalls_ReturnDifferentPorts(t *testing.T) {
40+
first, err := FreePort()
41+
require.NoError(t, err, "First FreePort call unexpectedly returned an error")
42+
second, err := FreePort()
43+
require.NoError(t, err, "Second FreePort call unexpectedly returned an error")
44+
assert.NotEqual(t, first, second, "Sequential calls should return different ports")
45+
}

0 commit comments

Comments
 (0)