main.prepareResume   B
last analyzed

Complexity

Conditions 7

Size

Total Lines 46
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 28
nop 3
dl 0
loc 46
rs 7.808
c 0
b 0
f 0
1
package main
2
3
import (
4
	"encoding/json"
5
	"os"
6
	"os/user"
7
	"path/filepath"
8
	"testing"
9
)
10
11
// Test setup and cleanup helpers
12
func prepareResume(t *testing.T, url string, parts []Part) (string, string) {
13
	// Create a temporary state file and part files for testing resume
14
	usr, _ := user.Current()
15
	homeDir := usr.HomeDir
16
	taskName := TaskFromURL(url)
17
	folderPath := filepath.Join(homeDir, dataFolder, taskName)
18
	stateFilePath := filepath.Join(folderPath, stateFileName)
19
20
	// Create the folder
21
	err := os.MkdirAll(folderPath, 0755)
22
	if err != nil {
23
		t.Fatalf("Failed to create test directory: %v", err)
24
	}
25
26
	// Create the state file
27
	state := &State{
28
		URL:   url,
29
		Parts: parts,
30
	}
31
32
	stateData, err := json.Marshal(state)
33
	if err != nil {
34
		t.Fatalf("Failed to marshal test state: %v", err)
35
	}
36
37
	err = os.WriteFile(stateFilePath, stateData, 0644)
38
	if err != nil {
39
		t.Fatalf("Failed to write test state file: %v", err)
40
	}
41
42
	// Create part files with some content to simulate partial downloads
43
	for _, part := range parts {
44
		partPath := filepath.Join(folderPath, filepath.Base(part.Path))
45
		// Write different amounts of data to each part file to test resuming
46
		contentSize := part.RangeFrom / 2 // Arbitrary formula for test data size
47
		if contentSize == 0 {
48
			contentSize = 10 // Minimum size for test
49
		}
50
		content := make([]byte, contentSize)
51
		err = os.WriteFile(partPath, content, 0644)
52
		if err != nil {
53
			t.Fatalf("Failed to create test part file: %v", err)
54
		}
55
	}
56
57
	return folderPath, taskName
58
}
59
60
func cleanupResume(folderPath string) {
61
	os.RemoveAll(folderPath)
62
}
63
64
func TestTaskPrint(t *testing.T) {
65
	// Setup test environment
66
	originalDataFolder := dataFolder
67
	dataFolder = ".hget_test/"
68
	defer func() {
69
		dataFolder = originalDataFolder
70
		usr, _ := user.Current()
71
		testFolder := filepath.Join(usr.HomeDir, dataFolder)
72
		os.RemoveAll(testFolder)
73
	}()
74
75
	// Create a few test download directories
76
	usr, _ := user.Current()
77
	homeDir := usr.HomeDir
78
	testFolder := filepath.Join(homeDir, dataFolder)
79
80
	err := os.MkdirAll(testFolder, 0755)
81
	if err != nil {
82
		t.Fatalf("Failed to create test directory: %v", err)
83
	}
84
85
	testDirs := []string{"test1", "test2", "test3"}
86
	for _, dir := range testDirs {
87
		err := os.MkdirAll(filepath.Join(testFolder, dir), 0755)
88
		if err != nil {
89
			t.Fatalf("Failed to create test subdirectory: %v", err)
90
		}
91
	}
92
93
	// Create a file too (should be ignored by TaskPrint)
94
	testFile := filepath.Join(testFolder, "testfile.txt")
95
	err = os.WriteFile(testFile, []byte("test content"), 0644)
96
	if err != nil {
97
		t.Fatalf("Failed to create test file: %v", err)
98
	}
99
100
	// Test TaskPrint
101
	err = TaskPrint()
102
	if err != nil {
103
		t.Fatalf("TaskPrint() failed: %v", err)
104
	}
105
106
	// Note: We can't easily check stdout, but we've verified the function executes without error
107
}
108
109
func TestResumeNonExistent(t *testing.T) {
110
	// Setup test environment
111
	originalDataFolder := dataFolder
112
	dataFolder = ".hget_test/"
113
	defer func() {
114
		dataFolder = originalDataFolder
115
		usr, _ := user.Current()
116
		testFolder := filepath.Join(usr.HomeDir, dataFolder)
117
		os.RemoveAll(testFolder)
118
	}()
119
120
	// Test resuming a non-existent task
121
	_, err := Resume("nonexistent-task")
122
	if err == nil {
123
		t.Errorf("Expected error when resuming non-existent task, got nil")
124
	}
125
}
126
127
// Go 1.21 has min function built-in, but for compatibility with older Go versions
128
func min(a, b int64) int64 {
129
	if a < b {
130
		return a
131
	}
132
	return b
133
}
134