mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-05 21:15:38 -05:00
- Add printers - Delete printers - Use polkit APIs as fallback on auth errors - Fix ref system to conditionally subscribe to cups when wanted
451 lines
13 KiB
Go
451 lines
13 KiB
Go
package cups
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
|
|
mocks_cups "github.com/AvengeMedia/DankMaterialShell/core/internal/mocks/cups"
|
|
"github.com/AvengeMedia/DankMaterialShell/core/pkg/ipp"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/mock"
|
|
)
|
|
|
|
func TestManager_GetPrinters(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
mockRet map[string]ipp.Attributes
|
|
mockErr error
|
|
want int
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "success",
|
|
mockRet: map[string]ipp.Attributes{
|
|
"printer1": {
|
|
ipp.AttributePrinterName: []ipp.Attribute{{Value: "printer1"}},
|
|
ipp.AttributePrinterUriSupported: []ipp.Attribute{{Value: "ipp://localhost/printers/printer1"}},
|
|
ipp.AttributePrinterState: []ipp.Attribute{{Value: 3}},
|
|
ipp.AttributePrinterStateReasons: []ipp.Attribute{{Value: "none"}},
|
|
ipp.AttributePrinterLocation: []ipp.Attribute{{Value: "Office"}},
|
|
ipp.AttributePrinterInfo: []ipp.Attribute{{Value: "Test Printer"}},
|
|
ipp.AttributePrinterMakeAndModel: []ipp.Attribute{{Value: "Generic"}},
|
|
ipp.AttributePrinterIsAcceptingJobs: []ipp.Attribute{{Value: true}},
|
|
},
|
|
},
|
|
mockErr: nil,
|
|
want: 1,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "error",
|
|
mockRet: nil,
|
|
mockErr: errors.New("test error"),
|
|
want: 0,
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(tt.mockRet, tt.mockErr)
|
|
|
|
m := &Manager{
|
|
client: mockClient,
|
|
}
|
|
|
|
got, err := m.GetPrinters()
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
} else {
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.want, len(got))
|
|
if len(got) > 0 {
|
|
assert.Equal(t, "printer1", got[0].Name)
|
|
assert.Equal(t, "idle", got[0].State)
|
|
assert.Equal(t, "Office", got[0].Location)
|
|
assert.True(t, got[0].Accepting)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestManager_GetJobs(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
mockRet map[int]ipp.Attributes
|
|
mockErr error
|
|
want int
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "success",
|
|
mockRet: map[int]ipp.Attributes{
|
|
1: {
|
|
ipp.AttributeJobID: []ipp.Attribute{{Value: 1}},
|
|
ipp.AttributeJobName: []ipp.Attribute{{Value: "test-job"}},
|
|
ipp.AttributeJobState: []ipp.Attribute{{Value: 5}},
|
|
ipp.AttributeJobPrinterURI: []ipp.Attribute{{Value: "ipp://localhost/printers/printer1"}},
|
|
ipp.AttributeJobOriginatingUserName: []ipp.Attribute{{Value: "testuser"}},
|
|
ipp.AttributeJobKilobyteOctets: []ipp.Attribute{{Value: 10}},
|
|
"time-at-creation": []ipp.Attribute{{Value: 1609459200}},
|
|
},
|
|
},
|
|
mockErr: nil,
|
|
want: 1,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "error",
|
|
mockRet: nil,
|
|
mockErr: errors.New("test error"),
|
|
want: 0,
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().GetJobs("printer1", "", "not-completed", false, 0, 0, mock.Anything).
|
|
Return(tt.mockRet, tt.mockErr)
|
|
|
|
m := &Manager{
|
|
client: mockClient,
|
|
}
|
|
|
|
got, err := m.GetJobs("printer1", "not-completed")
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
} else {
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.want, len(got))
|
|
if len(got) > 0 {
|
|
assert.Equal(t, 1, got[0].ID)
|
|
assert.Equal(t, "test-job", got[0].Name)
|
|
assert.Equal(t, "processing", got[0].State)
|
|
assert.Equal(t, "testuser", got[0].User)
|
|
assert.Equal(t, "printer1", got[0].Printer)
|
|
assert.Equal(t, 10240, got[0].Size)
|
|
assert.Equal(t, time.Unix(1609459200, 0), got[0].TimeCreated)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestManager_CancelJob(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().CancelJob(1, false).Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.CancelJob(1))
|
|
}
|
|
|
|
func TestManager_PausePrinter(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().PausePrinter("printer1").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.PausePrinter("printer1"))
|
|
}
|
|
|
|
func TestManager_ResumePrinter(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().ResumePrinter("printer1").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.ResumePrinter("printer1"))
|
|
}
|
|
|
|
func TestManager_PurgeJobs(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
mockErr error
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "success",
|
|
mockErr: nil,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "error",
|
|
mockErr: errors.New("test error"),
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().CancelAllJob("printer1", true).Return(tt.mockErr)
|
|
if !tt.wantErr {
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
}
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
|
|
err := m.PurgeJobs("printer1")
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
} else {
|
|
assert.NoError(t, err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestManager_GetDevices(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().GetDevices().Return(map[string]ipp.Attributes{
|
|
"usb://HP/LaserJet": {
|
|
"device-class": []ipp.Attribute{{Value: "direct"}},
|
|
"device-info": []ipp.Attribute{{Value: "HP LaserJet"}},
|
|
"device-make-and-model": []ipp.Attribute{{Value: "HP LaserJet 1020"}},
|
|
},
|
|
}, nil)
|
|
|
|
m := &Manager{client: mockClient}
|
|
got, err := m.GetDevices()
|
|
assert.NoError(t, err)
|
|
assert.Len(t, got, 1)
|
|
assert.Equal(t, "usb://HP/LaserJet", got[0].URI)
|
|
assert.Equal(t, "direct", got[0].Class)
|
|
}
|
|
|
|
func TestManager_GetPPDs(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
mockRet map[string]ipp.Attributes
|
|
mockErr error
|
|
want int
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "success",
|
|
mockRet: map[string]ipp.Attributes{
|
|
"drv:///sample.drv/generic.ppd": {
|
|
"ppd-make-and-model": []ipp.Attribute{{Value: "Generic PostScript"}},
|
|
"ppd-type": []ipp.Attribute{{Value: "ppd"}},
|
|
},
|
|
},
|
|
mockErr: nil,
|
|
want: 1,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "error",
|
|
mockRet: nil,
|
|
mockErr: errors.New("test error"),
|
|
want: 0,
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().GetPPDs().Return(tt.mockRet, tt.mockErr)
|
|
|
|
m := &Manager{client: mockClient}
|
|
|
|
got, err := m.GetPPDs()
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
return
|
|
}
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.want, len(got))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestManager_GetClasses(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
mockRet map[string]ipp.Attributes
|
|
mockErr error
|
|
want int
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "success",
|
|
mockRet: map[string]ipp.Attributes{
|
|
"office": {
|
|
ipp.AttributePrinterName: []ipp.Attribute{{Value: "office"}},
|
|
ipp.AttributePrinterState: []ipp.Attribute{{Value: 3}},
|
|
ipp.AttributeMemberNames: []ipp.Attribute{{Value: "printer1"}, {Value: "printer2"}},
|
|
},
|
|
},
|
|
mockErr: nil,
|
|
want: 1,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "error",
|
|
mockRet: nil,
|
|
mockErr: errors.New("test error"),
|
|
want: 0,
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().GetClasses(mock.Anything).Return(tt.mockRet, tt.mockErr)
|
|
|
|
m := &Manager{client: mockClient}
|
|
|
|
got, err := m.GetClasses()
|
|
if tt.wantErr {
|
|
assert.Error(t, err)
|
|
return
|
|
}
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, tt.want, len(got))
|
|
if len(got) > 0 {
|
|
assert.Equal(t, "office", got[0].Name)
|
|
assert.Equal(t, 2, len(got[0].Members))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestManager_CreatePrinter(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().CreatePrinter("newprinter", "usb://HP", "generic.ppd", true, "stop-printer", "info", "location").Return(nil)
|
|
mockClient.EXPECT().ResumePrinter("newprinter").Return(nil)
|
|
mockClient.EXPECT().AcceptJobs("newprinter").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.CreatePrinter("newprinter", "usb://HP", "generic.ppd", true, "stop-printer", "info", "location"))
|
|
}
|
|
|
|
func TestManager_DeletePrinter(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().DeletePrinter("printer1").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.DeletePrinter("printer1"))
|
|
}
|
|
|
|
func TestManager_AcceptJobs(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().AcceptJobs("printer1").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.AcceptJobs("printer1"))
|
|
}
|
|
|
|
func TestManager_RejectJobs(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().RejectJobs("printer1").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.RejectJobs("printer1"))
|
|
}
|
|
|
|
func TestManager_SetPrinterShared(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().SetPrinterIsShared("printer1", true).Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.SetPrinterShared("printer1", true))
|
|
}
|
|
|
|
func TestManager_SetPrinterLocation(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().SetPrinterLocation("printer1", "Office").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.SetPrinterLocation("printer1", "Office"))
|
|
}
|
|
|
|
func TestManager_SetPrinterInfo(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().SetPrinterInformation("printer1", "Main Printer").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.SetPrinterInfo("printer1", "Main Printer"))
|
|
}
|
|
|
|
func TestManager_MoveJob(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().MoveJob(1, "printer2").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
err := m.MoveJob(1, "printer2")
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestManager_PrintTestPage(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().PrintTestPage("printer1", mock.Anything, mock.Anything).Return(42, nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
jobID, err := m.PrintTestPage("printer1")
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, 42, jobID)
|
|
}
|
|
|
|
func TestManager_AddPrinterToClass(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().AddPrinterToClass("office", "printer1").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.AddPrinterToClass("office", "printer1"))
|
|
}
|
|
|
|
func TestManager_RemovePrinterFromClass(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().DeletePrinterFromClass("office", "printer1").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.RemovePrinterFromClass("office", "printer1"))
|
|
}
|
|
|
|
func TestManager_DeleteClass(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().DeleteClass("office").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.DeleteClass("office"))
|
|
}
|
|
|
|
func TestManager_RestartJob(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().RestartJob(1).Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.RestartJob(1))
|
|
}
|
|
|
|
func TestManager_HoldJob(t *testing.T) {
|
|
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
|
mockClient.EXPECT().HoldJobUntil(1, "indefinite").Return(nil)
|
|
mockClient.EXPECT().GetPrinters(mock.Anything).Return(map[string]ipp.Attributes{}, nil)
|
|
|
|
m := NewTestManager(mockClient, nil)
|
|
assert.NoError(t, m.HoldJob(1, "indefinite"))
|
|
}
|