FAILED
117 passed, 78 failed, 195 total
| Result | Test |
|---|---|
| No individual test rows were parsed. See raw output. | |
(0 rows affected) Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 16:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 16:00:00.000 2026-05-01 18:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 16:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 16:00:00.000 2026-05-01 18:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 16:00:00.000 1 2026-05-01 08:00:00.000 2026-05-01 16:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 16:00:00.000 2026-05-01 18:00:00.000 1 2026-05-01 16:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 broken thing alice 2026-05-01 11:00:00.000 5 2 1 0 1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 broken thing alice 2026-05-01 11:00:00.000 5 2 1 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 02:00:00.000 2026-05-01 06:00:00.000 1 2026-05-01 02:00:00.000 2026-05-01 06:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 16:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 16:00:00.000 2026-05-01 18:00:00.000 1 2026-05-01 06:00:00.000 2026-05-01 18:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 NULL NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 NULL 1 2026-05-01 06:00:00.000 NULL NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 999 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 10:00:00.000 999 2026-05-01 06:00:00.000 2026-05-01 10:00:00.000 NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- 2026-05-01 06:00:00.000 2026-05-01 08:00:00.000 1 2026-05-01 06:00:00.000 NULL NULL NULL NULL NULL NULL 0 0 1 2026-05-01 08:00:00.000 2026-05-01 16:00:00.000 1 2026-05-01 06:00:00.000 NULL NULL NULL NULL NULL NULL 0 0 1 2026-05-01 16:00:00.000 2026-05-02 00:00:00.000 1 2026-05-01 06:00:00.000 NULL NULL NULL NULL NULL NULL 0 0 1 Start End OriginalDelayId OriginalStart OriginalEnd Comments JustifiedByUser JustifiedDatetime DelayCodeId DelayCategoryId IsDelayManual IsMicroDelay AssetId ----------------------- ----------------------- --------------- ----------------------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ----------- --------------- ------------- ------------ ----------- BatchId:10 ReferenceId:5000 PartId:100 Timestamp:Feb 2 2026 12:00AM by NULL Success BatchId:1 ReferenceId:5000 PartId:100 Timestamp:Jan 1 2026 12:00AM by NULL Success BatchId:1 ReferenceId:5000 PartId:100 Timestamp:Jan 1 2026 12:00AM by NULL Success BatchId:1 ReferenceId:925357780 PartId:100 Timestamp:Jan 1 2026 12:00AM by NULL Success BatchId:10 ReferenceId:7777 PartId:100 Timestamp:Jan 1 2026 12:00AM by NULL Success BatchId:1 ReferenceId:5000 PartId:100 Timestamp:Jan 1 2026 12:00AM by test Success BatchId:11 ReferenceId:9999 PartId:100 Timestamp:NULL by NULL Success .[test 4 INSERT with explicit IsDefaultArray writes the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 1 INSERT writes PartTypeId and PartName] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145 .[test 26 LOG insert writes an informational audit log row] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145 .[test 28 LOG update with no changes writes no audit log row] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 13 UPDATE preserves IsActive IsDefaultArray and AuxPartId] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 24 VALIDATE NULL User throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%User is required%> Actual Message : <Procedure or function 'UpsertPart' expects parameter '@PartTypeId', which was not supplied.> Expected Error Number: 50000 Actual Error Number : 201 .[test 11 UPDATE overwrites PartTypeId and PartName of the targeted row] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 22 VALIDATE on non-existent PartId throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartId=99 not found%> Actual Message : <Procedure or function UpsertPart has too many arguments specified.> Expected Error Number: 50000 Actual Error Number : 8144 .[test 23 UPDATE with no changes still returns the PartId] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 20 UPDATE with AuxPartId = -1 preserves current] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 16 UPDATE with empty PartName preserves current] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 5 INSERT with explicit AuxPartId writes the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 15 UPDATE with PartTypeId = -1 preserves current] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 17 UPDATE with explicit IsActive flips the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 2 INSERT returns the new identity value] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145 .[test 31 LOG custom LogMessage replaces the auto-generated update message] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 21 UPDATE with explicit NULL AuxPartId clears the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 7 VALIDATE empty PartName throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartName is required%> Actual Message : <@User is not a parameter for procedure UpsertPart.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 25 VALIDATE empty User throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%User is required%> Actual Message : <Procedure or function 'UpsertPart' expects parameter '@PartTypeId', which was not supplied.> Expected Error Number: 50000 Actual Error Number : 201 .[test 19 UPDATE with explicit AuxPartId writes the new value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 32 LOG custom LogMessage is ignored on no-change update] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 18 UPDATE with explicit IsDefaultArray flips the value] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 10 VALIDATE NULL PartTypeId throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartTypeId is required%> Actual Message : <@User is not a parameter for procedure UpsertPart.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 12 UPDATE returns the targeted PartId] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 6 INSERT allows duplicate PartName values] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145 .[test 8 VALIDATE NULL PartName throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartName is required%> Actual Message : <@User is not a parameter for procedure UpsertPart.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 9 VALIDATE PartTypeId = -1 throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartTypeId is required%> Actual Message : <@User is not a parameter for procedure UpsertPart.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 30 LOG custom LogMessage replaces the auto-generated insert message] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 27 LOG update with changes writes an informational audit log row with the delta] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 29 LOG User parameter is forwarded to the audit log] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145 .[test 14 UPDATE only affects the targeted row] failed: (Error) Message: Procedure or function UpsertPart has too many arguments specified. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 2 | Number: 8144 .[test 3 INSERT leaves IsActive IsDefaultArray and AuxPartId at table defaults] failed: (Error) Message: @User is not a parameter for procedure UpsertPart. | Procedure: EQP.UpsertPart (0) | Severity, State: 16, 1 | Number: 8145 .[test 11 UPDATE with explicit SortOrder writes the new value] failed: (Error) Message: Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 4 | Number: 201 .[test 1 INSERT writes PartTypeName IsArray IsReplaceable and InheritedFrom] failed: (Error) Message: @IsReplaceable is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 8 UPDATE with empty PartTypeName preserves current] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 7 UPDATE returns the targeted PartTypeId] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 3 INSERT with optional params omitted honours table defaults] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 10 UPDATE with IsArray IsReplaceable and SortOrder omitted preserves current] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 14 UPDATE with no changes still returns the PartTypeId] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144 .[test 12 VALIDATE on non-existent PartTypeId throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartTypeId=99 not found%> Actual Message : <@User is not a parameter for procedure UpsertPartType.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 6 UPDATE overwrites all five columns of the existing row] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144 .[test 9 UPDATE with InheritedFrom = -1 preserves current] failed: (Error) Message: Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 4 | Number: 201 .[test 17 LOG insert writes an informational audit log row] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 20 LOG User parameter is forwarded to the audit log] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 23 LOG custom LogMessage is ignored on no-change update] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144 .[test 19 LOG update with no changes writes no audit log row] failed: (Error) Message: Procedure or function UpsertPartType has too many arguments specified. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 2 | Number: 8144 .[test 13 VALIDATE InheritedFrom equal to PartTypeId throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%cannot inherit from itself%> Actual Message : <Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied.> Expected Error Number: 50000 Actual Error Number : 201 .[test 4 VALIDATE empty PartTypeName throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartTypeName is required%> Actual Message : <@User is not a parameter for procedure UpsertPartType.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 5 VALIDATE NULL PartTypeName throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartTypeName is required%> Actual Message : <@User is not a parameter for procedure UpsertPartType.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 15 VALIDATE NULL User throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%User is required%> Actual Message : <Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied.> Expected Error Number: 50000 Actual Error Number : 201 .[test 22 LOG custom LogMessage replaces the auto-generated update message] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 16 VALIDATE empty User throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%User is required%> Actual Message : <Procedure or function 'UpsertPartType' expects parameter '@PartTypeName', which was not supplied.> Expected Error Number: 50000 Actual Error Number : 201 .[test 2 INSERT returns the new identity value] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 21 LOG custom LogMessage replaces the auto-generated insert message] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 18 LOG update with changes writes an informational audit log row with the delta] failed: (Error) Message: @User is not a parameter for procedure UpsertPartType. | Procedure: EQP.UpsertPartType (0) | Severity, State: 16, 1 | Number: 8145 .[test 17 LOG update with no changes writes no audit log row] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 9 UPDATE overwrites PositionName when edge already exists] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 20 LOG custom LogMessage replaces the auto-generated update message] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 11 UPDATE with empty PositionName preserves current] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 19 LOG custom LogMessage replaces the auto-generated insert message] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 14 VALIDATE empty User throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%User is required%> Actual Message : <@User is not a parameter for procedure UpsertPartTypeTree.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 16 LOG update with changes writes an informational audit log row with the delta] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 4 INSERT allows the same child type at multiple positions of the same parent] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 5 VALIDATE NULL ParentPartTypeId throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%ParentPartTypeId is required%> Actual Message : <@User is not a parameter for procedure UpsertPartTypeTree.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 1 INSERT writes ParentPartTypeId PartTypeId PositionId and PositionName] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 10 UPDATE returns zero] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 3 INSERT with omitted PositionName writes NULL] failed: (Error) Message: @User is not a parameter for procedure UpsertPartTypeTree. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 1 | Number: 8145 .[test 2 INSERT returns zero] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 6 VALIDATE NULL PartTypeId throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PartTypeId is required%> Actual Message : <@User is not a parameter for procedure UpsertPartTypeTree.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 13 VALIDATE NULL User throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%User is required%> Actual Message : <@User is not a parameter for procedure UpsertPartTypeTree.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 7 VALIDATE NULL PositionId throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%PositionId is required%> Actual Message : <@User is not a parameter for procedure UpsertPartTypeTree.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 8 VALIDATE self-referencing edge throws] failed: (Failure) Exception did not match expectation! Expected Message to be like <%Self-referencing edge not allowed%> Actual Message : <@User is not a parameter for procedure UpsertPartTypeTree.> Expected Error Number: 50000 Actual Error Number : 8145 .[test 15 LOG insert writes an informational audit log row] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 12 UPDATE with explicit NULL PositionName clears the value] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 21 LOG custom LogMessage is ignored on no-change update] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 .[test 18 LOG User parameter is forwarded to the audit log] failed: (Error) Message: Procedure or function UpsertPartTypeTree has too many arguments specified. | Procedure: EQP.UpsertPartTypeTree (0) | Severity, State: 16, 2 | Number: 8144 UpsertTask TO-DEFAULT-ARRAY 100 on Jan 1 2020 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success UpsertTask 100 to 1 pos 1 on May 22 2026 6:00AM by CORRECTOR | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success UpsertTask TO-DEFAULT-ARRAY 100 on Jan 1 2099 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success UpsertTask TO-DEFAULT-ARRAY 100 on Jan 1 2099 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success UpsertTask TO-DEFAULT-ARRAY 100 on Jan 1 2020 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success UpsertTask 100 to NULL pos NULL on May 22 2026 12:00PM by CORRECTOR | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success UpsertTask 100 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success UpsertTask 100 to NULL pos 1 on Jan 1 2099 12:00AM by TESTER | LastTaskId=NULL IsDefaultArray=NULL | Path A: Fresh Install Success .[test 33 VALIDATE: INSTALL fresh requires ParentPartId] failed: (Failure) Expected an error to be raised. UpsertTask TO-DEFAULT-ARRAY 100 on Jan 1 2099 12:00AM by TESTER | LastTaskId=NULL IsDefaultArray=NULL | Path A: Fresh Removal Success UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | Created PartId=101 | Success UpsertTask 100 to 200 pos 9 on May 22 2026 6:00AM by CORRECTOR | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success UpsertTask 100 to 1 pos 1 on Jun 10 2026 3:30PM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success UpsertTask 100 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | Created PartId=101 | Error: boom from MovePart spy .[test 24 LOG: error path writes error log and re-raises] failed: (Error) Message: UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | Created PartId=101 | Error: boom from MovePart spy | Procedure: EQP.UpsertTask (93) | Severity, State: 16, 17 | Number: 50000 (There was also a ROLLBACK ERROR --> Message: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. | Procedure: tSQLt.Private_RunTest_TestExecution (154) | Severity, State: 16, 1 | Number: 3903) UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | Created PartId=101 | Success UpsertTask 100 to 1 pos 1 on May 22 2026 6:00AM by TESTER | LastTaskId=3002 IsDefaultArray=0 | Path B: Correction Success UpsertTask 100 to 1 pos 1 on Jan 1 2020 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success UpsertTask TO-DEFAULT-ARRAY 100 on May 21 2026 2:30PM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success UpsertTask TO-DEFAULT-ARRAY 100 on May 21 2026 2:30PM by CORRECTOR | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan 1 2020 12:00AM by TESTER | Created PartId=101 | Success UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | Created PartId=101 | Success UpsertTask 100 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | LastTaskId=NULL IsDefaultArray=NULL | Path A: Fresh Install Success UpsertTask 100 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path A: Fresh Install Success UpsertTask CREATE+INSTALL Type=3 Name=Roof #42 to 1 pos 1 on Jan 1 2099 12:00AM by TESTER | Created PartId=101 | Success UpsertTask TO-DEFAULT-ARRAY 100 on Jan 1 2099 12:00AM by TESTER | LastTaskId=3000 IsDefaultArray=0 | Path A: Fresh Removal Success UpsertTask TO-DEFAULT-ARRAY 100 on Apr 1 2026 12:00AM by TESTER | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success UpsertTask TO-DEFAULT-ARRAY 100 on May 21 2026 2:30PM by CORRECTOR | LastTaskId=3001 IsDefaultArray=1 | Path B: Correction Success +----------------------+ |Test Execution Summary| +----------------------+ |No |Test Case Name |Dur(ms)|Result | +---+---------------------------------------------------------------------------------------------------------------------+-------+-------+ |1 |[DEL_GetDelay_Tests].[test IsDelayManual is aliased as IsManual for manual delay] | 107|Success| |2 |[DEL_GetDelay_Tests].[test returns delay row when DelayId exists] | 62|Success| |3 |[DEL_GetDelay_Tests].[test returns empty result set when DelayId does not exist] | 80|Success| |4 |[DEL_GetDelay_Tests].[test returns NULL End for active delay] | 81|Success| |5 |[DEL_GetDelay_Tests].[test returns NULL justification fields for unjustified delay] | 151|Success| |6 |[DEL_GetDelay_Tests].[test returns only matching delay when multiple delays exist] | 1418|Success| |7 |[DEL_GetDelay_Tests].[test returns split delay original fields] | 108|Success| |8 |[DEL_SpliceDelaysByShiftJob_Tests].[test assigns ShiftId via GetShiftId for new slices] | 107|Success| |9 |[DEL_SpliceDelaysByShiftJob_Tests].[test closes open delay at boundary for past shifts] | 91|Success| |10 |[DEL_SpliceDelaysByShiftJob_Tests].[test does not modify delay contained in one shift] | 91|Success| |11 |[DEL_SpliceDelaysByShiftJob_Tests].[test handles delay starting on shift boundary] | 83|Success| |12 |[DEL_SpliceDelaysByShiftJob_Tests].[test ignores delays before DaysBack window] | 109|Success| |13 |[DEL_SpliceDelaysByShiftJob_Tests].[test ignores delays starting after End parameter] | 153|Success| |14 |[DEL_SpliceDelaysByShiftJob_Tests].[test is idempotent on second run] | 120|Success| |15 |[DEL_SpliceDelaysByShiftJob_Tests].[test keeps open delay open in current shift] | 119|Success| |16 |[DEL_SpliceDelaysByShiftJob_Tests].[test marks slice non-micro when longer than MinDelayTime] | 87|Success| |17 |[DEL_SpliceDelaysByShiftJob_Tests].[test NULL AssetId processes only Caster EAF LMF] | 100|Success| |18 |[DEL_SpliceDelaysByShiftJob_Tests].[test preserves OriginalDelayId when re-splicing] | 97|Success| |19 |[DEL_SpliceDelaysByShiftJob_Tests].[test propagates justification and metadata to new slices] | 103|Success| |20 |[DEL_SpliceDelaysByShiftJob_Tests].[test sets OriginalDelayId to self for first splice] | 99|Success| |21 |[DEL_SpliceDelaysByShiftJob_Tests].[test splits delay crossing multiple shift boundaries] | 116|Success| |22 |[DEL_SpliceDelaysByShiftJob_Tests].[test splits delay crossing one shift boundary] | 118|Success| |23 |[DEL_SpliceDelaysByShiftJob_Tests].[test throws when AssetId does not exist] | 58|Success| |24 |[DEL_UpsertDelayCategory_Tests].[test insert ignores @IsActive parameter] | 141|Success| |25 |[DEL_UpsertDelayCategory_Tests].[test insert with name colliding inactive sibling succeeds] | 70|Success| |26 |[DEL_UpsertDelayCategory_Tests].[test insert with same name in different area succeeds] | 80|Success| |27 |[DEL_UpsertDelayCategory_Tests].[test insert writes Name Color and DelayAreaAssetId] | 60|Success| |28 |[DEL_UpsertDelayCategory_Tests].[test successful insert does not call WriteLog] | 67|Success| |29 |[DEL_UpsertDelayCategory_Tests].[test successful update calls WriteLog once] | 100|Success| |30 |[DEL_UpsertDelayCategory_Tests].[test throws 50000 when name collides with active sibling in same area] | 71|Success| |31 |[DEL_UpsertDelayCategory_Tests].[test throws 51001 when both DelayAreaAssetId and DelayCategoryId are NULL] | 50|Success| |32 |[DEL_UpsertDelayCategory_Tests].[test throws 51002 when DelayAreaAssetId is not a delay area] | 50|Success| |33 |[DEL_UpsertDelayCategory_Tests].[test throws 51002 when update reparents to a non-delay-area asset] | 54|Success| |34 |[DEL_UpsertDelayCategory_Tests].[test throws 51004 when DelayCategoryName is NULL] | 63|Success| |35 |[DEL_UpsertDelayCategory_Tests].[test throws 51005 when DelayCategoryColor is NULL] | 54|Success| |36 |[DEL_UpsertDelayCategory_Tests].[test throws 51006 when DelayCategoryId does not exist] | 59|Success| |37 |[DEL_UpsertDelayCategory_Tests].[test update inherits DelayAreaAssetId from existing row when NULL] | 66|Success| |38 |[DEL_UpsertDelayCategory_Tests].[test update reparents category to new DelayAreaAssetId] | 58|Success| |39 |[DEL_UpsertDelayCategory_Tests].[test update toggles IsActive] | 58|Success| |40 |[DEL_UpsertDelayCategory_Tests].[test update with same name as self does not throw 50000] | 75|Success| |41 |[DEL_UpsertDelayCategory_Tests].[test update writes new DelayCategoryColor] | 139|Success| |42 |[DEL_UpsertDelayCategory_Tests].[test update writes new DelayCategoryName] | 66|Success| |43 |[DEL_UpsertManualDelay_Tests].[test insert open delay leaves End NULL] | 182|Success| |44 |[DEL_UpsertManualDelay_Tests].[test insert throws 51301 when AssetId is NULL] | 87|Success| |45 |[DEL_UpsertManualDelay_Tests].[test insert throws 51302 when Start is NULL] | 91|Success| |46 |[DEL_UpsertManualDelay_Tests].[test insert throws 51303 when an open delay precedes Start] | 149|Success| |47 |[DEL_UpsertManualDelay_Tests].[test insert throws 51304 when End is before Start] | 107|Success| |48 |[DEL_UpsertManualDelay_Tests].[test insert throws 51305 when range collides with existing delay] | 75|Success| |49 |[DEL_UpsertManualDelay_Tests].[test insert throws 51306 when End is NULL and a later delay exists] | 87|Success| |50 |[DEL_UpsertManualDelay_Tests].[test insert with code stamps JustifiedByUser and JustifiedDatetime] | 95|Success| |51 |[DEL_UpsertManualDelay_Tests].[test insert with End sets IsDelayManual IsMicroDelay and ShiftId] | 169|Success| |52 |[DEL_UpsertManualDelay_Tests].[test insert without code or category leaves Justified fields NULL] | 87|Success| |53 |[DEL_UpsertManualDelay_Tests].[test NULL skips Code and Category existence check] | 99|Success| |54 |[DEL_UpsertManualDelay_Tests].[test sentinel -1 skips Code and Category existence check] | 112|Success| |55 |[DEL_UpsertManualDelay_Tests].[test throws 51309 when DelayCategoryId does not exist] | 96|Success| |56 |[DEL_UpsertManualDelay_Tests].[test throws 51309 when DelayCodeId does not exist] | 79|Success| |57 |[DEL_UpsertManualDelay_Tests].[test throws 51310 when no shift exists for Start] | 86|Success| |58 |[DEL_UpsertManualDelay_Tests].[test update changing code re-stamps Justified fields] | 99|Success| |59 |[DEL_UpsertManualDelay_Tests].[test update inherits current Start when @Start is NULL] | 162|Success| |60 |[DEL_UpsertManualDelay_Tests].[test update throws 51307 when DelayId does not exist] | 75|Success| |61 |[DEL_UpsertManualDelay_Tests].[test update throws 51308 when delay is not manual] | 82|Success| |62 |[DEL_UpsertManualDelay_Tests].[test update throws 51311 when an open delay precedes Start] | 87|Success| |63 |[DEL_UpsertManualDelay_Tests].[test update throws 51312 when inherited End is before new Start] | 145|Success| |64 |[DEL_UpsertManualDelay_Tests].[test update with non-NULL Comments overwrites] | 212|Success| |65 |[DEL_UpsertManualDelay_Tests].[test update with NULL Comments keeps existing] | 129|Success| |66 |[DEL_UpsertManualDelay_Tests].[test update with NULL wipes code] | 136|Success| |67 |[DEL_UpsertManualDelay_Tests].[test update with same code does not re-stamp Justified fields] | 191|Success| |68 |[DEL_UpsertManualDelay_Tests].[test update with sentinel -1 keeps current code] | 128|Success| |69 |[DEL_UpsertManualDelay_Tests].[test update with sentinel -1 on code does not re-stamp Justified fields] | 183|Success| |70 |[DEL_UpsertManualDelay_Tests].[test update writes new Start End and recomputes ShiftId] | 196|Success| |71 |[EQP_UpsertBatch_Tests].[test 1 INSERT: new ReferenceId+PartId creates a row] | 37|Success| |72 |[EQP_UpsertBatch_Tests].[test 10 LOG: writes audit on insert but not on a no-op re-run] | 54|Success| |73 |[EQP_UpsertBatch_Tests].[test 2 INSERT: omitted BatchId resolves existing key instead of inserting] | 29|Success| |74 |[EQP_UpsertBatch_Tests].[test 3 INSERT: null Timestamp skips the duplicate guard and inserts] | 55|Success| |75 |[EQP_UpsertBatch_Tests].[test 4 INSERT: omitted ReferenceId is backfilled with a non-null value] | 52|Success| |76 |[EQP_UpsertBatch_Tests].[test 5 UPDATE: identical re-run is a no-op] | 41|Success| |77 |[EQP_UpsertBatch_Tests].[test 6 UPDATE: changed Timestamp updates the existing row] | 51|Success| |78 |[EQP_UpsertBatch_Tests].[test 7 UPDATE: explicit BatchId with different ReferenceId overwrites it] | 49|Success| |79 |[EQP_UpsertBatch_Tests].[test 8 VALIDATE: same Timestamp+PartId on a different batch raises] | 28|Success| |80 |[EQP_UpsertBatch_Tests].[test 9 VALIDATE: returns the persisted BatchId on insert and no-op] | 55|Success| |81 |[EQP_UpsertBatchMetrics_Tests].[test 1 INSERT: new BatchId+MetricTypeId creates a row] | 47|Success| |82 |[EQP_UpsertBatchMetrics_Tests].[test 2 INSERT: float Value is stored precisely] | 38|Success| |83 |[EQP_UpsertBatchMetrics_Tests].[test 3 INSERT: null Value inserts a null] | 47|Success| |84 |[EQP_UpsertBatchMetrics_Tests].[test 4 UPDATE: existing row has its Value overwritten] | 46|Success| |85 |[EQP_UpsertBatchMetrics_Tests].[test 5 UPDATE: replace touches only the matching MetricTypeId] | 41|Success| |86 |[EQP_UpsertBatchMetrics_Tests].[test 6 VALIDATE: failed write logs E and re-raises] | 37|Success| |87 |[EQP_UpsertTask_Tests].[test 1 INSERT: CREATE writes catParts row] | 124|Success| |88 |[EQP_UpsertTask_Tests].[test 10 UPDATE: CORRECTION removal updates existing task in place] | 103|Success| |89 |[EQP_UpsertTask_Tests].[test 11 UPDATE: CORRECTION removal preserves ParentPartId and PositionId] | 130|Success| |90 |[EQP_UpsertTask_Tests].[test 12 UPDATE: CORRECTION install updates existing task in place] | 182|Success| |91 |[EQP_UpsertTask_Tests].[test 13 UPDATE: CORRECTION install with NULL parent preserves existing] | 99|Success| |92 |[EQP_UpsertTask_Tests].[test 14 UPDATE: CORRECTION install overwrites parent and position] | 100|Success| |93 |[EQP_UpsertTask_Tests].[test 15 VALIDATE: CREATE requires PartTypeId] | 87|Success| |94 |[EQP_UpsertTask_Tests].[test 16 VALIDATE: CREATE requires PartName] | 129|Success| |95 |[EQP_UpsertTask_Tests].[test 17 VALIDATE: CREATE requires ParentPartId] | 66|Success| |96 |[EQP_UpsertTask_Tests].[test 18 VALIDATE: REMOVE fresh floor is last install timestamp] | 85|Success| |97 |[EQP_UpsertTask_Tests].[test 19 VALIDATE: CORRECTION removal floor is previous timestamp] | 95|Success| |98 |[EQP_UpsertTask_Tests].[test 2 INSERT: CREATE invokes MovePart with returned PartId] | 79|Success| |99 |[EQP_UpsertTask_Tests].[test 20 VALIDATE: INSTALL part floor blocks earlier than last task] | 79|Success| |100|[EQP_UpsertTask_Tests].[test 21 VALIDATE: INSTALL location floor blocks slot overlap] | 111|Success| |101|[EQP_UpsertTask_Tests].[test 22 VALIDATE: NULL timestamp is coerced to GETUTCDATE] | 188|Success| |102|[EQP_UpsertTask_Tests].[test 23 LOG: CREATE success writes informational log] | 108|Success| |103|[EQP_UpsertTask_Tests].[test 25 LOG: REMOVE fresh success writes informational log] | 187|Success| |104|[EQP_UpsertTask_Tests].[test 26 LOG: CORRECTION removal success writes informational log] | 185|Success| |105|[EQP_UpsertTask_Tests].[test 27 LOG: INSTALL fresh success writes informational log] | 125|Success| |106|[EQP_UpsertTask_Tests].[test 28 LOG: CORRECTION install success writes informational log] | 118|Success| |107|[EQP_UpsertTask_Tests].[test 29 INSERT: CREATE backdated triggers cache rebuild] | 196|Success| |108|[EQP_UpsertTask_Tests].[test 3 INSERT: CREATE returns new PartId] | 178|Success| |109|[EQP_UpsertTask_Tests].[test 30 INSERT: REMOVE backdated deletes batches and batch metrics] | 103|Success| |110|[EQP_UpsertTask_Tests].[test 31 UPDATE: CORRECTION removal backdated deletes window batches] | 95|Success| |111|[EQP_UpsertTask_Tests].[test 32 INSERT: INSTALL backdated triggers cache rebuild] | 118|Success| |112|[EQP_UpsertTask_Tests].[test 4 INSERT: INSTALL from default array invokes MovePart] | 175|Success| |113|[EQP_UpsertTask_Tests].[test 5 INSERT: INSTALL with no history invokes MovePart] | 83|Success| |114|[EQP_UpsertTask_Tests].[test 6 INSERT: INSTALL future timestamp does not rebuild cache] | 104|Success| |115|[EQP_UpsertTask_Tests].[test 7 INSERT: REMOVE invokes MovePart with MoveToDefaultArray] | 71|Success| |116|[EQP_UpsertTask_Tests].[test 8 INSERT: REMOVE with no history invokes MovePart with MoveToDefaultArray] | 108|Success| |117|[EQP_UpsertTask_Tests].[test 9 INSERT: REMOVE future timestamp does not delete batches] | 124|Success| |118|[EQP_UpsertPart_Tests].[test 10 VALIDATE NULL PartTypeId throws] | 123|Failure| |119|[EQP_UpsertPart_Tests].[test 22 VALIDATE on non-existent PartId throws] | 29|Failure| |120|[EQP_UpsertPart_Tests].[test 24 VALIDATE NULL User throws] | 34|Failure| |121|[EQP_UpsertPart_Tests].[test 25 VALIDATE empty User throws] | 33|Failure| |122|[EQP_UpsertPart_Tests].[test 7 VALIDATE empty PartName throws] | 33|Failure| |123|[EQP_UpsertPart_Tests].[test 8 VALIDATE NULL PartName throws] | 21|Failure| |124|[EQP_UpsertPart_Tests].[test 9 VALIDATE PartTypeId = -1 throws] | 54|Failure| |125|[EQP_UpsertPartType_Tests].[test 12 VALIDATE on non-existent PartTypeId throws] | 71|Failure| |126|[EQP_UpsertPartType_Tests].[test 13 VALIDATE InheritedFrom equal to PartTypeId throws] | 33|Failure| |127|[EQP_UpsertPartType_Tests].[test 15 VALIDATE NULL User throws] | 29|Failure| |128|[EQP_UpsertPartType_Tests].[test 16 VALIDATE empty User throws] | 33|Failure| |129|[EQP_UpsertPartType_Tests].[test 4 VALIDATE empty PartTypeName throws] | 33|Failure| |130|[EQP_UpsertPartType_Tests].[test 5 VALIDATE NULL PartTypeName throws] | 29|Failure| |131|[EQP_UpsertPartTypeTree_Tests].[test 13 VALIDATE NULL User throws] | 20|Failure| |132|[EQP_UpsertPartTypeTree_Tests].[test 14 VALIDATE empty User throws] | 29|Failure| |133|[EQP_UpsertPartTypeTree_Tests].[test 5 VALIDATE NULL ParentPartTypeId throws] | 29|Failure| |134|[EQP_UpsertPartTypeTree_Tests].[test 6 VALIDATE NULL PartTypeId throws] | 29|Failure| |135|[EQP_UpsertPartTypeTree_Tests].[test 7 VALIDATE NULL PositionId throws] | 21|Failure| |136|[EQP_UpsertPartTypeTree_Tests].[test 8 VALIDATE self-referencing edge throws] | 25|Failure| |137|[EQP_UpsertTask_Tests].[test 33 VALIDATE: INSTALL fresh requires ParentPartId] | 104|Failure| |138|[EQP_UpsertPart_Tests].[test 1 INSERT writes PartTypeId and PartName] | 32|Error | |139|[EQP_UpsertPart_Tests].[test 11 UPDATE overwrites PartTypeId and PartName of the targeted row] | 34|Error | |140|[EQP_UpsertPart_Tests].[test 12 UPDATE returns the targeted PartId] | 24|Error | |141|[EQP_UpsertPart_Tests].[test 13 UPDATE preserves IsActive IsDefaultArray and AuxPartId] | 37|Error | |142|[EQP_UpsertPart_Tests].[test 14 UPDATE only affects the targeted row] | 53|Error | |143|[EQP_UpsertPart_Tests].[test 15 UPDATE with PartTypeId = -1 preserves current] | 29|Error | |144|[EQP_UpsertPart_Tests].[test 16 UPDATE with empty PartName preserves current] | 42|Error | |145|[EQP_UpsertPart_Tests].[test 17 UPDATE with explicit IsActive flips the value] | 38|Error | |146|[EQP_UpsertPart_Tests].[test 18 UPDATE with explicit IsDefaultArray flips the value] | 37|Error | |147|[EQP_UpsertPart_Tests].[test 19 UPDATE with explicit AuxPartId writes the new value] | 34|Error | |148|[EQP_UpsertPart_Tests].[test 2 INSERT returns the new identity value] | 33|Error | |149|[EQP_UpsertPart_Tests].[test 20 UPDATE with AuxPartId = -1 preserves current] | 46|Error | |150|[EQP_UpsertPart_Tests].[test 21 UPDATE with explicit NULL AuxPartId clears the value] | 29|Error | |151|[EQP_UpsertPart_Tests].[test 23 UPDATE with no changes still returns the PartId] | 38|Error | |152|[EQP_UpsertPart_Tests].[test 26 LOG insert writes an informational audit log row] | 34|Error | |153|[EQP_UpsertPart_Tests].[test 27 LOG update with changes writes an informational audit log row with the delta] | 37|Error | |154|[EQP_UpsertPart_Tests].[test 28 LOG update with no changes writes no audit log row] | 33|Error | |155|[EQP_UpsertPart_Tests].[test 29 LOG User parameter is forwarded to the audit log] | 29|Error | |156|[EQP_UpsertPart_Tests].[test 3 INSERT leaves IsActive IsDefaultArray and AuxPartId at table defaults] | 66|Error | |157|[EQP_UpsertPart_Tests].[test 30 LOG custom LogMessage replaces the auto-generated insert message] | 37|Error | |158|[EQP_UpsertPart_Tests].[test 31 LOG custom LogMessage replaces the auto-generated update message] | 37|Error | |159|[EQP_UpsertPart_Tests].[test 32 LOG custom LogMessage is ignored on no-change update] | 66|Error | |160|[EQP_UpsertPart_Tests].[test 4 INSERT with explicit IsDefaultArray writes the value] | 42|Error | |161|[EQP_UpsertPart_Tests].[test 5 INSERT with explicit AuxPartId writes the value] | 33|Error | |162|[EQP_UpsertPart_Tests].[test 6 INSERT allows duplicate PartName values] | 33|Error | |163|[EQP_UpsertPartType_Tests].[test 1 INSERT writes PartTypeName IsArray IsReplaceable and InheritedFrom] | 29|Error | |164|[EQP_UpsertPartType_Tests].[test 10 UPDATE with IsArray IsReplaceable and SortOrder omitted preserves current] | 25|Error | |165|[EQP_UpsertPartType_Tests].[test 11 UPDATE with explicit SortOrder writes the new value] | 38|Error | |166|[EQP_UpsertPartType_Tests].[test 14 UPDATE with no changes still returns the PartTypeId] | 33|Error | |167|[EQP_UpsertPartType_Tests].[test 17 LOG insert writes an informational audit log row] | 33|Error | |168|[EQP_UpsertPartType_Tests].[test 18 LOG update with changes writes an informational audit log row with the delta] | 58|Error | |169|[EQP_UpsertPartType_Tests].[test 19 LOG update with no changes writes no audit log row] | 45|Error | |170|[EQP_UpsertPartType_Tests].[test 2 INSERT returns the new identity value] | 29|Error | |171|[EQP_UpsertPartType_Tests].[test 20 LOG User parameter is forwarded to the audit log] | 29|Error | |172|[EQP_UpsertPartType_Tests].[test 21 LOG custom LogMessage replaces the auto-generated insert message] | 24|Error | |173|[EQP_UpsertPartType_Tests].[test 22 LOG custom LogMessage replaces the auto-generated update message] | 29|Error | |174|[EQP_UpsertPartType_Tests].[test 23 LOG custom LogMessage is ignored on no-change update] | 34|Error | |175|[EQP_UpsertPartType_Tests].[test 3 INSERT with optional params omitted honours table defaults] | 47|Error | |176|[EQP_UpsertPartType_Tests].[test 6 UPDATE overwrites all five columns of the existing row] | 29|Error | |177|[EQP_UpsertPartType_Tests].[test 7 UPDATE returns the targeted PartTypeId] | 34|Error | |178|[EQP_UpsertPartType_Tests].[test 8 UPDATE with empty PartTypeName preserves current] | 29|Error | |179|[EQP_UpsertPartType_Tests].[test 9 UPDATE with InheritedFrom = -1 preserves current] | 33|Error | |180|[EQP_UpsertPartTypeTree_Tests].[test 1 INSERT writes ParentPartTypeId PartTypeId PositionId and PositionName] | 21|Error | |181|[EQP_UpsertPartTypeTree_Tests].[test 10 UPDATE returns zero] | 25|Error | |182|[EQP_UpsertPartTypeTree_Tests].[test 11 UPDATE with empty PositionName preserves current] | 29|Error | |183|[EQP_UpsertPartTypeTree_Tests].[test 12 UPDATE with explicit NULL PositionName clears the value] | 21|Error | |184|[EQP_UpsertPartTypeTree_Tests].[test 15 LOG insert writes an informational audit log row] | 33|Error | |185|[EQP_UpsertPartTypeTree_Tests].[test 16 LOG update with changes writes an informational audit log row with the delta]| 25|Error | |186|[EQP_UpsertPartTypeTree_Tests].[test 17 LOG update with no changes writes no audit log row] | 38|Error | |187|[EQP_UpsertPartTypeTree_Tests].[test 18 LOG User parameter is forwarded to the audit log] | 116|Error | |188|[EQP_UpsertPartTypeTree_Tests].[test 19 LOG custom LogMessage replaces the auto-generated insert message] | 33|Error | |189|[EQP_UpsertPartTypeTree_Tests].[test 2 INSERT returns zero] | 24|Error | |190|[EQP_UpsertPartTypeTree_Tests].[test 20 LOG custom LogMessage replaces the auto-generated update message] | 33|Error | |191|[EQP_UpsertPartTypeTree_Tests].[test 21 LOG custom LogMessage is ignored on no-change update] | 25|Error | |192|[EQP_UpsertPartTypeTree_Tests].[test 3 INSERT with omitted PositionName writes NULL] | 29|Error | |193|[EQP_UpsertPartTypeTree_Tests].[test 4 INSERT allows the same child type at multiple positions of the same parent] | 29|Error | |194|[EQP_UpsertPartTypeTree_Tests].[test 9 UPDATE overwrites PositionName when edge already exists] | 73|Error | |195|[EQP_UpsertTask_Tests].[test 24 LOG: error path writes error log and re-raises] | 198|Error | ---------------------------------------------------------------------------------------------- Msg 50000, Level 16, State 10, Server 3a9ed6e32c34, Line 1 Test Case Summary: 195 test case(s) executed, 117 succeeded, 0 skipped, 20 failed, 58 errored. ----------------------------------------------------------------------------------------------