0.1.2-prod

This commit is contained in:
2025-08-21 10:42:35 +03:00
parent 6fab3c0a0d
commit 173d4c670c
5 changed files with 333 additions and 106 deletions

129
pkg/shtrih/driver_test.go Normal file
View File

@@ -0,0 +1,129 @@
// Тесты для пакета shtrih
package shtrih
import (
"fmt"
"reflect"
"testing"
)
// getSampleFiscalInfo создает пример структуры FiscalInfo для использования в тестах.
func getSampleFiscalInfo() *FiscalInfo {
return &FiscalInfo{
ModelName: "ШТРИХ-М-01Ф",
SerialNumber: "0012345678901234",
RNM: "0009876543210987",
OrganizationName: "ООО Ромашка",
Inn: "7701234567",
FnSerial: "9960440300112233",
FfdVersion: "120",
}
}
// TestMockDriver_SuccessfulPath проверяет стандартный успешный сценарий:
// подключение -> получение данных -> отключение.
func TestMockDriver_SuccessfulPath(t *testing.T) {
// Arrange: Готовим данные и создаем мок-драйвер.
sampleData := getSampleFiscalInfo()
driver := NewMockDriver(sampleData, nil, nil)
// Act 1: Подключаемся.
err := driver.Connect()
if err != nil {
t.Fatalf("Connect() вернул неожиданную ошибку: %v", err)
}
// Act 2: Получаем фискальную информацию.
info, err := driver.GetFiscalInfo()
if err != nil {
t.Fatalf("GetFiscalInfo() вернул неожиданную ошибку: %v", err)
}
// Act 3: Отключаемся.
err = driver.Disconnect()
if err != nil {
t.Fatalf("Disconnect() вернул неожиданную ошибку: %v", err)
}
// Assert: Проверяем, что полученные данные соответствуют ожидаемым.
if !reflect.DeepEqual(info, sampleData) {
t.Errorf("Полученные данные не совпадают с мок-данными.\nПолучено: %+v\nОжидалось: %+v", info, sampleData)
}
// Assert: Проверяем, что все методы были вызваны.
// Для этого нам нужно преобразовать интерфейс обратно в конкретный тип мок-драйвера.
mock, ok := driver.(*mockDriver)
if !ok {
t.Fatal("Не удалось преобразовать драйвер в *mockDriver для проверки вызовов.")
}
if !mock.ConnectCalled {
t.Error("Ожидалось, что Connect() будет вызван, но этого не произошло.")
}
if !mock.GetFiscalInfoCalled {
t.Error("Ожидалось, что GetFiscalInfo() будет вызван, но этого не произошло.")
}
if !mock.DisconnectCalled {
t.Error("Ожидалось, что Disconnect() будет вызван, но этого не произошло.")
}
}
// TestMockDriver_ConnectError проверяет, что драйвер корректно обрабатывает
// ошибку, возвращаемую при подключении.
func TestMockDriver_ConnectError(t *testing.T) {
// Arrange: Создаем симулируемую ошибку.
simulatedError := fmt.Errorf("порт COM5 занят")
driver := NewMockDriver(nil, simulatedError, nil)
// Act: Пытаемся подключиться.
err := driver.Connect()
// Assert: Проверяем, что была возвращена именно наша ошибка.
if err == nil {
t.Fatal("Connect() не вернул ошибку, хотя ожидалось.")
}
if err != simulatedError {
t.Errorf("Connect() вернул неверную ошибку. Получено: %v, Ожидалось: %v", err, simulatedError)
}
}
// TestMockDriver_GetInfoWhileDisconnected проверяет, что попытка получить
// данные без предварительного подключения вернет ошибку.
func TestMockDriver_GetInfoWhileDisconnected(t *testing.T) {
// Arrange: Создаем стандартный мок-драйвер.
driver := NewMockDriver(getSampleFiscalInfo(), nil, nil)
// Act: Сразу пытаемся получить данные.
_, err := driver.GetFiscalInfo()
// Assert: Проверяем, что получили ошибку.
if err == nil {
t.Fatal("GetFiscalInfo() не вернул ошибку при вызове без подключения.")
}
}
// TestMockDriver_GetInfoError проверяет, что драйвер корректно обрабатывает
// ошибку, возвращаемую при получении данных.
func TestMockDriver_GetInfoError(t *testing.T) {
// Arrange: Создаем симулируемую ошибку.
simulatedError := fmt.Errorf("ошибка чтения ФН")
driver := NewMockDriver(nil, nil, simulatedError)
// Act
err := driver.Connect()
if err != nil {
t.Fatalf("Connect() неожиданно вернул ошибку: %v", err)
}
info, err := driver.GetFiscalInfo()
// Assert
if err == nil {
t.Fatal("GetFiscalInfo() не вернул ошибку, хотя ожидалось.")
}
if err != simulatedError {
t.Errorf("GetFiscalInfo() вернул неверную ошибку. Получено: %v, Ожидалось: %v", err, simulatedError)
}
if info != nil {
t.Error("GetFiscalInfo() вернул данные вместе с ошибкой, хотя должен был вернуть nil.")
}
}

View File

@@ -1,33 +1,85 @@
// Package shtrih (продолжение)
package shtrih
// mockDriver — это имитация драйвера для тестирования.
import (
"fmt"
"log"
)
// mockDriver представляет собой имитацию реального драйвера для целей тестирования.
// Он реализует интерфейс Driver.
type mockDriver struct {
FiscalInfoToReturn *FiscalInfo
ErrorToReturn error
// MockData - это структура с фискальными данными, которую вернет GetFiscalInfo.
MockData *FiscalInfo
// ConnectErr - ошибка, которую вернет метод Connect, если она задана.
ConnectErr error
// GetFiscalInfoErr - ошибка, которую вернет метод GetFiscalInfo, если она задана.
GetFiscalInfoErr error
// Внутренние флаги для проверки вызовов в тестах.
connected bool
ConnectCalled bool
DisconnectCalled bool
GetFiscalInfoCalled bool
}
// NewMock создает новый мок-драйвер.
func NewMock(info *FiscalInfo, err error) Driver {
// NewMockDriver является конструктором для создания нового мок-драйвера.
// Позволяет заранее определить, какие данные и ошибки будут возвращаться.
func NewMockDriver(data *FiscalInfo, connectErr, getInfoErr error) Driver {
return &mockDriver{
FiscalInfoToReturn: info,
ErrorToReturn: err,
MockData: data,
ConnectErr: connectErr,
GetFiscalInfoErr: getInfoErr,
}
}
// Connect имитирует подключение к ККТ.
func (m *mockDriver) Connect() error {
if m.ErrorToReturn != nil {
return m.ErrorToReturn
m.ConnectCalled = true
log.Println("Mock Driver: Connect() вызван.")
// Если была задана ошибка подключения, возвращаем ее.
if m.ConnectErr != nil {
return m.ConnectErr
}
// Если уже "подключены", ничего не делаем.
if m.connected {
return nil
}
m.connected = true
return nil
}
// Disconnect имитирует отключение от ККТ.
func (m *mockDriver) Disconnect() error {
m.DisconnectCalled = true
log.Println("Mock Driver: Disconnect() вызван.")
// Если не были "подключены", ничего не делаем.
if !m.connected {
return nil
}
m.connected = false
return nil
}
// GetFiscalInfo имитирует получение фискальных данных.
func (m *mockDriver) GetFiscalInfo() (*FiscalInfo, error) {
if m.ErrorToReturn != nil {
return nil, m.ErrorToReturn
m.GetFiscalInfoCalled = true
log.Println("Mock Driver: GetFiscalInfo() вызван.")
// Проверяем, было ли установлено "соединение".
if !m.connected {
return nil, fmt.Errorf("мок-драйвер: не подключен")
}
return m.FiscalInfoToReturn, nil
// Если была задана ошибка получения данных, возвращаем ее.
if m.GetFiscalInfoErr != nil {
return nil, m.GetFiscalInfoErr
}
// Если не были предоставлены мок-данные, возвращаем ошибку.
if m.MockData == nil {
return nil, fmt.Errorf("мок-драйвер: данные для имитации не предоставлены")
}
return m.MockData, nil
}