mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-13 00:42:49 -05:00
switch hto monorepo structure
This commit is contained in:
351
backend/internal/server/cups/manager_test.go
Normal file
351
backend/internal/server/cups/manager_test.go
Normal file
@@ -0,0 +1,351 @@
|
||||
package cups
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
mocks_cups "github.com/AvengeMedia/DankMaterialShell/backend/internal/mocks/cups"
|
||||
"github.com/AvengeMedia/DankMaterialShell/backend/pkg/ipp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestNewManager(t *testing.T) {
|
||||
m := &Manager{
|
||||
state: &CUPSState{
|
||||
Printers: make(map[string]*Printer),
|
||||
},
|
||||
client: nil,
|
||||
stopChan: make(chan struct{}),
|
||||
dirty: make(chan struct{}, 1),
|
||||
subscribers: make(map[string]chan CUPSState),
|
||||
}
|
||||
|
||||
assert.NotNil(t, m)
|
||||
assert.NotNil(t, m.state)
|
||||
}
|
||||
|
||||
func TestManager_GetState(t *testing.T) {
|
||||
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
||||
|
||||
m := &Manager{
|
||||
state: &CUPSState{
|
||||
Printers: map[string]*Printer{
|
||||
"test-printer": {
|
||||
Name: "test-printer",
|
||||
State: "idle",
|
||||
},
|
||||
},
|
||||
},
|
||||
client: mockClient,
|
||||
stopChan: make(chan struct{}),
|
||||
dirty: make(chan struct{}, 1),
|
||||
subscribers: make(map[string]chan CUPSState),
|
||||
}
|
||||
|
||||
state := m.GetState()
|
||||
assert.Equal(t, 1, len(state.Printers))
|
||||
assert.Equal(t, "test-printer", state.Printers["test-printer"].Name)
|
||||
}
|
||||
|
||||
func TestManager_Subscribe(t *testing.T) {
|
||||
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
||||
|
||||
m := &Manager{
|
||||
state: &CUPSState{
|
||||
Printers: make(map[string]*Printer),
|
||||
},
|
||||
client: mockClient,
|
||||
stopChan: make(chan struct{}),
|
||||
dirty: make(chan struct{}, 1),
|
||||
subscribers: make(map[string]chan CUPSState),
|
||||
}
|
||||
|
||||
ch := m.Subscribe("test-client")
|
||||
assert.NotNil(t, ch)
|
||||
assert.Equal(t, 1, len(m.subscribers))
|
||||
|
||||
m.Unsubscribe("test-client")
|
||||
assert.Equal(t, 0, len(m.subscribers))
|
||||
}
|
||||
|
||||
func TestManager_Close(t *testing.T) {
|
||||
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
||||
|
||||
m := &Manager{
|
||||
state: &CUPSState{
|
||||
Printers: make(map[string]*Printer),
|
||||
},
|
||||
client: mockClient,
|
||||
stopChan: make(chan struct{}),
|
||||
dirty: make(chan struct{}, 1),
|
||||
subscribers: make(map[string]chan CUPSState),
|
||||
}
|
||||
|
||||
m.eventWG.Add(1)
|
||||
go func() {
|
||||
defer m.eventWG.Done()
|
||||
<-m.stopChan
|
||||
}()
|
||||
|
||||
m.notifierWg.Add(1)
|
||||
go func() {
|
||||
defer m.notifierWg.Done()
|
||||
<-m.stopChan
|
||||
}()
|
||||
|
||||
m.Close()
|
||||
assert.Equal(t, 0, len(m.subscribers))
|
||||
}
|
||||
|
||||
func TestStateChanged(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
oldState *CUPSState
|
||||
newState *CUPSState
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "no change",
|
||||
oldState: &CUPSState{
|
||||
Printers: map[string]*Printer{
|
||||
"p1": {Name: "p1", State: "idle"},
|
||||
},
|
||||
},
|
||||
newState: &CUPSState{
|
||||
Printers: map[string]*Printer{
|
||||
"p1": {Name: "p1", State: "idle"},
|
||||
},
|
||||
},
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "state changed",
|
||||
oldState: &CUPSState{
|
||||
Printers: map[string]*Printer{
|
||||
"p1": {Name: "p1", State: "idle"},
|
||||
},
|
||||
},
|
||||
newState: &CUPSState{
|
||||
Printers: map[string]*Printer{
|
||||
"p1": {Name: "p1", State: "processing"},
|
||||
},
|
||||
},
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "printer added",
|
||||
oldState: &CUPSState{
|
||||
Printers: map[string]*Printer{},
|
||||
},
|
||||
newState: &CUPSState{
|
||||
Printers: map[string]*Printer{
|
||||
"p1": {Name: "p1", State: "idle"},
|
||||
},
|
||||
},
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "printer removed",
|
||||
oldState: &CUPSState{
|
||||
Printers: map[string]*Printer{
|
||||
"p1": {Name: "p1", State: "idle"},
|
||||
},
|
||||
},
|
||||
newState: &CUPSState{
|
||||
Printers: map[string]*Printer{},
|
||||
},
|
||||
want: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := stateChanged(tt.oldState, tt.newState)
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestParsePrinterState(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
attrs ipp.Attributes
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "idle",
|
||||
attrs: ipp.Attributes{
|
||||
ipp.AttributePrinterState: []ipp.Attribute{{Value: 3}},
|
||||
},
|
||||
want: "idle",
|
||||
},
|
||||
{
|
||||
name: "processing",
|
||||
attrs: ipp.Attributes{
|
||||
ipp.AttributePrinterState: []ipp.Attribute{{Value: 4}},
|
||||
},
|
||||
want: "processing",
|
||||
},
|
||||
{
|
||||
name: "stopped",
|
||||
attrs: ipp.Attributes{
|
||||
ipp.AttributePrinterState: []ipp.Attribute{{Value: 5}},
|
||||
},
|
||||
want: "stopped",
|
||||
},
|
||||
{
|
||||
name: "unknown",
|
||||
attrs: ipp.Attributes{},
|
||||
want: "unknown",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := parsePrinterState(tt.attrs)
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseJobState(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
attrs ipp.Attributes
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "pending",
|
||||
attrs: ipp.Attributes{
|
||||
ipp.AttributeJobState: []ipp.Attribute{{Value: 3}},
|
||||
},
|
||||
want: "pending",
|
||||
},
|
||||
{
|
||||
name: "processing",
|
||||
attrs: ipp.Attributes{
|
||||
ipp.AttributeJobState: []ipp.Attribute{{Value: 5}},
|
||||
},
|
||||
want: "processing",
|
||||
},
|
||||
{
|
||||
name: "completed",
|
||||
attrs: ipp.Attributes{
|
||||
ipp.AttributeJobState: []ipp.Attribute{{Value: 9}},
|
||||
},
|
||||
want: "completed",
|
||||
},
|
||||
{
|
||||
name: "unknown",
|
||||
attrs: ipp.Attributes{},
|
||||
want: "unknown",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := parseJobState(tt.attrs)
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetStringAttr(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
attrs ipp.Attributes
|
||||
key string
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "string value",
|
||||
attrs: ipp.Attributes{
|
||||
"test-key": []ipp.Attribute{{Value: "test-value"}},
|
||||
},
|
||||
key: "test-key",
|
||||
want: "test-value",
|
||||
},
|
||||
{
|
||||
name: "missing key",
|
||||
attrs: ipp.Attributes{},
|
||||
key: "missing",
|
||||
want: "",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := getStringAttr(tt.attrs, tt.key)
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetIntAttr(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
attrs ipp.Attributes
|
||||
key string
|
||||
want int
|
||||
}{
|
||||
{
|
||||
name: "int value",
|
||||
attrs: ipp.Attributes{
|
||||
"test-key": []ipp.Attribute{{Value: 42}},
|
||||
},
|
||||
key: "test-key",
|
||||
want: 42,
|
||||
},
|
||||
{
|
||||
name: "missing key",
|
||||
attrs: ipp.Attributes{},
|
||||
key: "missing",
|
||||
want: 0,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := getIntAttr(tt.attrs, tt.key)
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetBoolAttr(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
attrs ipp.Attributes
|
||||
key string
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "true value",
|
||||
attrs: ipp.Attributes{
|
||||
"test-key": []ipp.Attribute{{Value: true}},
|
||||
},
|
||||
key: "test-key",
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "false value",
|
||||
attrs: ipp.Attributes{
|
||||
"test-key": []ipp.Attribute{{Value: false}},
|
||||
},
|
||||
key: "test-key",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "missing key",
|
||||
attrs: ipp.Attributes{},
|
||||
key: "missing",
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := getBoolAttr(tt.attrs, tt.key)
|
||||
assert.Equal(t, tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user