docs: 修正物料导入计划中 Task 5/6 的测试片段笔误
- Task 5:expectImportLog 的行数参数显式转 int64。database/sql 会把实参归一成 driver.Value(int→int64),sqlmock 按类型比对,传 Go int 必然匹配不上 - Task 5:expectImportLog 补 fileName 参数,模板非法那条用例传的文件名与其它用例不同 - Task 5:事务内 SQL 的期望顺序改为「推进 code_rules → 分批 INSERT」, 与已提交的 ImportTx 实现(material.go:480 在 :485 之前)一致 - Task 6:测试片段补上缺失的 strings import 按修正后的片段替换 internal/service/material_import_test.go 实跑,5 个用例全通过。
This commit is contained in:
parent
e853846070
commit
f34803e1a2
|
|
@ -1307,9 +1307,14 @@ func expectImportMasterData(mock sqlmock.Sqlmock, withRule bool) {
|
|||
}
|
||||
}
|
||||
|
||||
func expectImportLog(mock sqlmock.Sqlmock, status string, total, success, failed int, reason string) {
|
||||
// fileName 由调用方指定:多数用例用「物料.xlsx」,模板非法那条用的是另一个名字。
|
||||
// reason 用 interface{}:成功场景断言具体空串,失败场景传 sqlmock.AnyArg() 表示
|
||||
// 只校验"写了一条记录",不锁死文案。
|
||||
// 行数显式转 int64:database/sql 会把实参归一成 driver.Value(int→int64),
|
||||
// sqlmock 按类型比对,直接传 Go int 匹配不上。
|
||||
func expectImportLog(mock sqlmock.Sqlmock, fileName, status string, total, success, failed int, reason interface{}) {
|
||||
mock.ExpectExec(regexp.QuoteMeta(`INSERT INTO material_import_logs (organization_id, operator, file_name, total_rows, success_rows, failed_rows, status, failure_reason) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)).
|
||||
WithArgs(int64(1), "tester", "物料.xlsx", total, success, failed, status, reason).
|
||||
WithArgs(int64(1), "tester", fileName, int64(total), int64(success), int64(failed), status, reason).
|
||||
WillReturnResult(sqlmock.NewResult(9, 1))
|
||||
}
|
||||
|
||||
|
|
@ -1318,7 +1323,7 @@ func TestMaterialImportServiceReportsRowErrorsWithoutWritingMaterials(t *testing
|
|||
defer cleanup()
|
||||
|
||||
expectImportMasterData(mock, true)
|
||||
expectImportLog(mock, "failed", 2, 0, 2, sqlmock.AnyArg())
|
||||
expectImportLog(mock, "物料.xlsx", "failed", 2, 0, 2, sqlmock.AnyArg())
|
||||
|
||||
data := buildTestWorkbook(t, [][]string{
|
||||
{"", "", "", "机械结构类", "标准件"}, // 名称缺失
|
||||
|
|
@ -1347,7 +1352,7 @@ func TestMaterialImportServiceReportsMissingCodeRule(t *testing.T) {
|
|||
defer cleanup()
|
||||
|
||||
expectImportMasterData(mock, false)
|
||||
expectImportLog(mock, "failed", 1, 0, 1, sqlmock.AnyArg())
|
||||
expectImportLog(mock, "物料.xlsx", "failed", 1, 0, 1, sqlmock.AnyArg())
|
||||
|
||||
data := buildTestWorkbook(t, [][]string{
|
||||
{"螺栓", "", "个", "机械结构类", "标准件"},
|
||||
|
|
@ -1368,7 +1373,7 @@ func TestMaterialImportServiceRejectsInvalidTemplate(t *testing.T) {
|
|||
mock, cleanup := newImportServiceMock(t)
|
||||
defer cleanup()
|
||||
|
||||
expectImportLog(mock, "failed", 0, 0, 0, sqlmock.AnyArg())
|
||||
expectImportLog(mock, "错的.xlsx", "failed", 0, 0, 0, sqlmock.AnyArg())
|
||||
|
||||
result, err := NewMaterialImportService().Import(1, "tester", "错的.xlsx", strings.NewReader("not an xlsx"))
|
||||
if err == nil {
|
||||
|
|
@ -1387,7 +1392,8 @@ func TestMaterialImportServiceImportsWhenAllRowsValid(t *testing.T) {
|
|||
defer cleanup()
|
||||
|
||||
expectImportMasterData(mock, true)
|
||||
// 事务内:锁规则 → 取已占用编码 → 插入 → 推进序号 → 回查 ID
|
||||
// 事务内:锁规则 → 取已占用编码 → 推进序号 → 插入 → 回查 ID
|
||||
// ImportTx 先把整批编码分配完并推进 code_rules,再分批插入。
|
||||
mock.ExpectBegin()
|
||||
mock.ExpectQuery(regexp.QuoteMeta(`SELECT id, organization_id, category_id, prefix, sequence_length, next_sequence FROM code_rules WHERE organization_id = ? AND category_id = ? AND status = 'active' FOR UPDATE`)).
|
||||
WithArgs(int64(1), int64(12)).
|
||||
|
|
@ -1396,15 +1402,15 @@ func TestMaterialImportServiceImportsWhenAllRowsValid(t *testing.T) {
|
|||
mock.ExpectQuery(`SELECT material_code FROM materials WHERE organization_id = \? AND material_code LIKE \?`).
|
||||
WithArgs(int64(1), "A01%").
|
||||
WillReturnRows(sqlmock.NewRows([]string{"material_code"}))
|
||||
mock.ExpectExec(`INSERT INTO materials`).WillReturnResult(sqlmock.NewResult(31, 1))
|
||||
mock.ExpectExec(regexp.QuoteMeta(`UPDATE code_rules SET next_sequence = ? WHERE id = ?`)).
|
||||
WithArgs(int64(202), int64(5)).WillReturnResult(sqlmock.NewResult(0, 1))
|
||||
mock.ExpectExec(`INSERT INTO materials`).WillReturnResult(sqlmock.NewResult(31, 1))
|
||||
mock.ExpectQuery(`SELECT id, material_code FROM materials WHERE organization_id = \? AND material_code IN \(\?\)`).
|
||||
WithArgs(int64(1), "A010201").
|
||||
WillReturnRows(sqlmock.NewRows([]string{"id", "material_code"}).AddRow(31, "A010201"))
|
||||
mock.ExpectExec(`INSERT INTO material_logs`).WillReturnResult(sqlmock.NewResult(1, 1))
|
||||
mock.ExpectCommit()
|
||||
expectImportLog(mock, "success", 1, 1, 0, "")
|
||||
expectImportLog(mock, "物料.xlsx", "success", 1, 1, 0, "")
|
||||
|
||||
data := buildTestWorkbook(t, [][]string{
|
||||
{"内六角螺栓", "M8x30", "个", "机械结构类", "标准件"},
|
||||
|
|
@ -1430,11 +1436,12 @@ func TestMaterialImportServiceRollsBackWhenInsertFails(t *testing.T) {
|
|||
mock.ExpectQuery(`FOR UPDATE`).WillReturnRows(sqlmock.NewRows([]string{"id", "organization_id", "category_id", "prefix", "sequence_length", "next_sequence"}).
|
||||
AddRow(5, 1, 12, "A01", 4, 201))
|
||||
mock.ExpectQuery(`SELECT material_code FROM materials`).WillReturnRows(sqlmock.NewRows([]string{"material_code"}))
|
||||
mock.ExpectExec(`INSERT INTO materials`).WillReturnResult(sqlmock.NewResult(0, 0))
|
||||
mock.ExpectExec(regexp.QuoteMeta(`UPDATE code_rules SET next_sequence = ? WHERE id = ?`)).WillReturnResult(sqlmock.NewResult(0, 1))
|
||||
mock.ExpectExec(`INSERT INTO materials`).WillReturnResult(sqlmock.NewResult(0, 0))
|
||||
// 插入后回查不到 ID(模拟插入未真正落库),persist 据此报错并回滚
|
||||
mock.ExpectQuery(`SELECT id, material_code FROM materials`).WillReturnRows(sqlmock.NewRows([]string{"id", "material_code"}))
|
||||
mock.ExpectRollback()
|
||||
expectImportLog(mock, "failed", 1, 0, 1, sqlmock.AnyArg())
|
||||
expectImportLog(mock, "物料.xlsx", "failed", 1, 0, 1, sqlmock.AnyArg())
|
||||
|
||||
data := buildTestWorkbook(t, [][]string{
|
||||
{"内六角螺栓", "M8x30", "个", "机械结构类", "标准件"},
|
||||
|
|
@ -1810,6 +1817,7 @@ package handler
|
|||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user