@@ -1565,6 +1565,137 @@ describe('Database', () => {
15651565 } ) ;
15661566 } ) ;
15671567
1568+ describe ( 'runTransactionAsync' , ( ) => {
1569+ const SESSION = new FakeSession ( ) ;
1570+ const TRANSACTION = new FakeTransaction (
1571+ { } as google . spanner . v1 . TransactionOptions . ReadWrite
1572+ ) ;
1573+
1574+ let pool : FakeSessionPool ;
1575+
1576+ beforeEach ( ( ) => {
1577+ pool = database . pool_ ;
1578+ ( sandbox . stub ( pool , 'getSession' ) as sinon . SinonStub ) . callsFake (
1579+ callback => {
1580+ callback ( null , SESSION , TRANSACTION ) ;
1581+ }
1582+ ) ;
1583+ } ) ;
1584+
1585+ it ( 'with no error' , async ( ) => {
1586+ const fakeValue = { } ;
1587+
1588+ sandbox
1589+ . stub ( FakeAsyncTransactionRunner . prototype , 'run' )
1590+ . resolves ( fakeValue ) ;
1591+
1592+ const value = await database . runTransactionAsync ( async txn => {
1593+ const result = await txn . run ( 'SELECT 1' ) ;
1594+ await txn . commit ( ) ;
1595+ return result ;
1596+ } ) ;
1597+
1598+ assert . strictEqual ( value , fakeValue ) ;
1599+
1600+ await provider . forceFlush ( ) ;
1601+ await traceExporter . forceFlush ( ) ;
1602+ const spans = traceExporter . getFinishedSpans ( ) ;
1603+ withAllSpansHaveDBName ( spans ) ;
1604+
1605+ const actualSpanNames : string [ ] = [ ] ;
1606+ const actualEventNames : string [ ] = [ ] ;
1607+ spans . forEach ( span => {
1608+ actualSpanNames . push ( span . name ) ;
1609+ span . events . forEach ( event => {
1610+ actualEventNames . push ( event . name ) ;
1611+ } ) ;
1612+ } ) ;
1613+
1614+ const expectedSpanNames = [ 'CloudSpanner.Database.runTransactionAsync' ] ;
1615+ assert . deepStrictEqual (
1616+ actualSpanNames ,
1617+ expectedSpanNames ,
1618+ `span names mismatch:\n\tGot: ${ actualSpanNames } \n\tWant: ${ expectedSpanNames } `
1619+ ) ;
1620+
1621+ // Ensure that the span actually produced an error that was recorded.
1622+ const firstSpan = spans [ 0 ] ;
1623+ assert . strictEqual (
1624+ SpanStatusCode . UNSET ,
1625+ firstSpan . status . code ,
1626+ 'Unexpected span status'
1627+ ) ;
1628+ assert . strictEqual (
1629+ undefined ,
1630+ firstSpan . status . message ,
1631+ 'Unexpected span status message'
1632+ ) ;
1633+
1634+ const expectedEventNames = [ 'Using Session' ] ;
1635+ assert . deepStrictEqual (
1636+ actualEventNames ,
1637+ expectedEventNames ,
1638+ `Unexpected events:\n\tGot: ${ actualEventNames } \n\tWant: ${ expectedEventNames } `
1639+ ) ;
1640+ } ) ;
1641+
1642+ it ( 'with error' , async ( ) => {
1643+ const ourException = new Error ( 'our thrown error' ) ;
1644+ sandbox
1645+ . stub ( FakeAsyncTransactionRunner . prototype , 'run' )
1646+ . throws ( ourException ) ;
1647+
1648+ assert . rejects ( async ( ) => {
1649+ const value = await database . runTransactionAsync ( async txn => {
1650+ const result = await txn . run ( 'SELECT 1' ) ;
1651+ await txn . commit ( ) ;
1652+ return result ;
1653+ } ) ;
1654+ } , ourException ) ;
1655+
1656+ await provider . forceFlush ( ) ;
1657+ await traceExporter . forceFlush ( ) ;
1658+ const spans = traceExporter . getFinishedSpans ( ) ;
1659+ withAllSpansHaveDBName ( spans ) ;
1660+
1661+ const actualSpanNames : string [ ] = [ ] ;
1662+ const actualEventNames : string [ ] = [ ] ;
1663+ spans . forEach ( span => {
1664+ actualSpanNames . push ( span . name ) ;
1665+ span . events . forEach ( event => {
1666+ actualEventNames . push ( event . name ) ;
1667+ } ) ;
1668+ } ) ;
1669+
1670+ const expectedSpanNames = [ 'CloudSpanner.Database.runTransactionAsync' ] ;
1671+ assert . deepStrictEqual (
1672+ actualSpanNames ,
1673+ expectedSpanNames ,
1674+ `span names mismatch:\n\tGot: ${ actualSpanNames } \n\tWant: ${ expectedSpanNames } `
1675+ ) ;
1676+
1677+ // Ensure that the span actually produced an error that was recorded.
1678+ const firstSpan = spans [ 0 ] ;
1679+ assert . strictEqual (
1680+ firstSpan . status . code ,
1681+ SpanStatusCode . ERROR ,
1682+ 'Unexpected span status'
1683+ ) ;
1684+ assert . strictEqual (
1685+ firstSpan . status . message ,
1686+ ourException . message ,
1687+ 'Unexpected span status message'
1688+ ) ;
1689+
1690+ const expectedEventNames = [ 'Using Session' ] ;
1691+ assert . deepStrictEqual (
1692+ actualEventNames ,
1693+ expectedEventNames ,
1694+ `Unexpected events:\n\tGot: ${ actualEventNames } \n\tWant: ${ expectedEventNames } `
1695+ ) ;
1696+ } ) ;
1697+ } ) ;
1698+
15681699 describe ( 'runStream' , ( ) => {
15691700 const QUERY = {
15701701 sql : 'SELECT * FROM table' ,
0 commit comments