Skip to content

Commit aedd48d

Browse files
committed
More notes to consider when we test transactions; Wrote another test for Private_NoTransactionHandleTable and confirmed that we are done with this functionality (for now).
1 parent a6b8260 commit aedd48d

3 files changed

Lines changed: 59 additions & 37 deletions

File tree

Source/tSQLt.Private_NoTransactionHandleTable.ssp.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ BEGIN
7373
BEGIN
7474
EXEC('DELETE FROM ' + @FullTableName +';');
7575
END;
76-
ELSE IF (@TableAction IN ('Ignore','Hide'))
76+
ELSE IF (@TableAction IN ('Ignore','Hide'))
7777
BEGIN
78+
/* Hidden tables will be restored by UndoTestDoubles. */
7879
RETURN;
7980
END;
8081
ELSE

Tests/Private_NoTransactionHandleTableTests.class.sql

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -577,49 +577,69 @@ END;
577577
GO
578578
/*-----------------------------------------------------------------------------------------------*/
579579
GO
580-
581-
582-
CREATE PROCEDURE Private_NoTransactionHandleTableTests.[test TODO]
580+
CREATE PROCEDURE Private_NoTransactionHandleTableTests.[test if @TableAction is Hide, @Action Save, Save: do nothing on second save]
583581
AS
584582
BEGIN
585-
EXEC tSQLt.Fail 'TODO';
586-
--tSQLt.Run 'Private_NoTransactionHandleTableTests'.[test if @TableAction is Restore, @Action Save, Save: the second Save does nothing]'
587-
/*--
588-
TODO
589-
590-
I can rerun them and nothing "bad" happens. But what is "bad"?
591-
What about when I intersperse calls to Save/Reset with UndoTestDoubles?
583+
CREATE TABLE Private_NoTransactionHandleTableTests.Table1 (Id INT, col1 NVARCHAR(MAX));
584+
INSERT INTO Private_NoTransactionHandleTableTests.Table1 VALUES (2,'c'), (3,'a');
585+
EXEC tSQLt.Private_NoTransactionHandleTable @Action = 'Save', @FullTableName = '[Private_NoTransactionHandleTableTests].[Table1]', @TableAction = 'Hide';
592586

593-
Some scenarios to consider
594-
1: Save, Reset
595-
2: Save, Save, Reset
596-
3: Save, Reset, Reset
597-
4: Save, Save, Reset, Reset
587+
SELECT object_id, SCHEMA_NAME(schema_id) [schema_name], name INTO #Before FROM sys.tables;
598588

599-
@TableAction = Restore
600-
5: ?*test* Save (Restore), Save (Restore) --> The second save does nothing, because it checks the #TableBackupLog.
601-
6: Save (Restore), Save (Restore) Eclipsed #TableBackupLog --> The second save takes a new backup because it cannot see #TableBackupLog.
602-
7: ?*test* Save (Restore), Save (Restore) Eclipsed #TableBackupLog, Reset (Restore) Eclipsed #TableBackupLog, Reset (Restore) --> Should be equivalent to scenario 1.
603-
8: ?*test* Save (Restore), Save (Restore), Reset (Restore), Reset (Restore) --> Should be equivalent to scenario 1.
604-
9: ?*test* Save (Restore), Save (Restore) Eclipsed #TableBackupLog, Reset (Restore) --> Should be equivalent to scenario 1.
605-
17: ?*test* Save (Restore), Reset (Restore), Reset (Restore) --> Should be equivalent to scenario 1.
589+
EXEC tSQLt.Private_NoTransactionHandleTable @Action = 'Save', @FullTableName = '[Private_NoTransactionHandleTableTests].[Table1]', @TableAction = 'Hide';
606590

607-
@TableAction = Hide
608-
10: ?*test* Save (Hide), Save (Hide) --> We can't hide something we can't see. Check to see if the object is already hidden, if so do nothing. If not, throw an error.
609-
11: Save (Hide), Save (Hide) Eclipsed #TableBackupLog --> Same as scenario 10.
610-
12: Save (Hide), Save (Hide) Eclipsed #TableBackupLog, Reset (Hide) Eclipsed #TableBackupLog, Reset (Hide) --> Should be equivalent to Scenario 1.
611-
13: Save (Hide), Save (Hide), Reset (Hide), Reset (Hide) --> Should be equivalent to Scenario 1.
612-
14: Save (Hide), Save (Hide) Eclipsed #TableBackupLog, Reset (Hide) --> Should be equivalent to Scenario 1.
613-
18: Save (Hide), Reset (Hide), Reset (Hide) --> Should be equivalent to scenario 1.
591+
SELECT * INTO #Actual
592+
FROM (
593+
(
594+
SELECT 'Extra'[?],object_id, SCHEMA_NAME(schema_id) [schema_name], name FROM sys.tables
595+
EXCEPT
596+
SELECT 'Extra'[?],* FROM #Before
597+
)
598+
UNION ALL
599+
(
600+
SELECT 'Missing'[?],* FROM #Before
601+
EXCEPT
602+
SELECT 'Missing'[?],object_id, SCHEMA_NAME(schema_id) [schema_name], name FROM sys.tables
603+
)
604+
) X;
605+
606+
EXEC tSQLt.AssertEmptyTable @TableName = '#Actual';
607+
END;
608+
GO
609+
/*-----------------------------------------------------------------------------------------------*/
610+
GO
611+
CREATE PROCEDURE Private_NoTransactionHandleTableTests.[test if @TableAction is Hide, @Action Save, Save, Reset, Reset: does nothing in total]
612+
AS
613+
BEGIN
614+
CREATE TABLE Private_NoTransactionHandleTableTests.Table1 (Id INT, col1 NVARCHAR(MAX));
615+
INSERT INTO Private_NoTransactionHandleTableTests.Table1 VALUES (2,'c'), (3,'a');
614616

615-
@TableAction = Truncate
616-
15: ?*test* Save (Truncate), Save (Truncate), Reset (Truncate), Save (Truncate), Reset (Truncate), Reset (Truncate) --> Should be idempotent. Any table with TableAction=Truncate should be empty after any number of save, reset actions.
617+
SELECT object_id, SCHEMA_NAME(schema_id) [schema_name], name INTO #Before FROM sys.tables;
617618

618-
@TableAction = Ignore
619-
16: ?*test* Save (Ignore), Save (Ignore), Reset (Ignore), Reset (Ignore) --> No Op. ExpectNoException.s
619+
EXEC tSQLt.Private_NoTransactionHandleTable @Action = 'Save', @FullTableName = '[Private_NoTransactionHandleTableTests].[Table1]', @TableAction = 'Hide';
620+
EXEC tSQLt.Private_NoTransactionHandleTable @Action = 'Save', @FullTableName = '[Private_NoTransactionHandleTableTests].[Table1]', @TableAction = 'Hide';
621+
EXEC tSQLt.Private_NoTransactionHandleTable @Action = 'Reset', @FullTableName = '[Private_NoTransactionHandleTableTests].[Table1]', @TableAction = 'Hide';
622+
EXEC tSQLt.Private_NoTransactionHandleTable @Action = 'Reset', @FullTableName = '[Private_NoTransactionHandleTableTests].[Table1]', @TableAction = 'Hide';
623+
EXEC tSQLt.UndoTestDoubles;
620624

621-
--*/
625+
SELECT * INTO #Actual
626+
FROM (
627+
(
628+
SELECT 'Extra'[?],object_id, SCHEMA_NAME(schema_id) [schema_name], name FROM sys.tables
629+
EXCEPT
630+
SELECT 'Extra'[?],* FROM #Before
631+
)
632+
UNION ALL
633+
(
634+
SELECT 'Missing'[?],* FROM #Before
635+
EXCEPT
636+
SELECT 'Missing'[?],object_id, SCHEMA_NAME(schema_id) [schema_name], name FROM sys.tables
637+
)
638+
) X;
639+
640+
EXEC tSQLt.AssertEmptyTable @TableName = '#Actual';
622641
END;
623642
GO
624643
/*-----------------------------------------------------------------------------------------------*/
625-
GO
644+
GO
645+

Tests/Run_Methods_Tests.class.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2496,7 +2496,8 @@ GO
24962496
3b. New transaction after test (COMMIT, but new one created within the test)
24972497
24982498
4. Transaction test renders transaction uncommitable (Won't be able to write to anything, including tSQLt.TestResults or a variety of temp tables.)
2499-
2499+
2500+
- currently AssertNoSideEffects causes additional problems if executed inside an uncommittable transaction (It tries to write to a new temp table) <-- does this need to be changed?
25002501
- do existing tests already cover some of the scenarios described above?
25012502
25022503
--*/

0 commit comments

Comments
 (0)