1
+ from __future__ import absolute_import
2
+
3
+ import pytest
4
+ from sqlalchemy import create_engine , Column , Integer , String
5
+ from sqlalchemy .ext .declarative import declarative_base
6
+ from sqlalchemy .orm import sessionmaker
7
+ from sqlalchemy .sql .expression import Insert , Delete
8
+
9
+ from aws_xray_sdk .core import xray_recorder , patch
10
+ from aws_xray_sdk .core .context import Context
11
+
12
+ Base = declarative_base ()
13
+
14
+
15
+ class User (Base ):
16
+ __tablename__ = 'users'
17
+
18
+ id = Column (Integer , primary_key = True )
19
+ name = Column (String )
20
+ fullname = Column (String )
21
+ password = Column (String )
22
+
23
+
24
+ @pytest .fixture ()
25
+ def engine ():
26
+ """
27
+ Clean up context storage on each test run and begin a segment
28
+ so that later subsegment can be attached. After each test run
29
+ it cleans up context storage again.
30
+ """
31
+ from aws_xray_sdk .ext .sqlalchemy_core import unpatch
32
+ patch (('sqlalchemy_core' ,))
33
+ engine = create_engine ('sqlite:///:memory:' )
34
+ xray_recorder .configure (service = 'test' , sampling = False , context = Context ())
35
+ xray_recorder .begin_segment ('name' )
36
+ Base .metadata .create_all (engine )
37
+ xray_recorder .clear_trace_entities ()
38
+ xray_recorder .begin_segment ('name' )
39
+ yield engine
40
+ xray_recorder .clear_trace_entities ()
41
+ unpatch ()
42
+
43
+
44
+ @pytest .fixture ()
45
+ def connection (engine ):
46
+ return engine .connect ()
47
+
48
+
49
+ @pytest .fixture ()
50
+ def session (engine ):
51
+ Session = sessionmaker (bind = engine )
52
+ return Session ()
53
+
54
+
55
+ def test_all (session ):
56
+ """ Test calling all() on get all records.
57
+ Verify we run the query and return the SQL as metdata"""
58
+ session .query (User ).all ()
59
+ assert len (xray_recorder .current_segment ().subsegments ) == 1
60
+ sql_meta = xray_recorder .current_segment ().subsegments [0 ].sql
61
+ assert sql_meta ['url' ] == 'sqlite:///:memory:'
62
+ assert sql_meta ['sanitized_query' ].startswith ('SELECT' )
63
+ assert sql_meta ['sanitized_query' ].endswith ('FROM users' )
64
+
65
+
66
+ def test_add (session ):
67
+ """ Test calling add() on insert a row.
68
+ Verify we that we capture trace for the add"""
69
+ password = "123456"
70
+ john = User (name = 'John' , fullname = "John Doe" , password = password )
71
+ session .add (john )
72
+ session .commit ()
73
+ assert len (xray_recorder .current_segment ().subsegments ) == 1
74
+ sql_meta = xray_recorder .current_segment ().subsegments [0 ].sql
75
+ assert sql_meta ['sanitized_query' ].startswith ('INSERT INTO users' )
76
+ assert password not in sql_meta ['sanitized_query' ]
77
+
78
+
79
+ def test_filter_first (session ):
80
+ """ Test calling filter().first() on get first filtered records.
81
+ Verify we run the query and return the SQL as metdata"""
82
+ session .query (User ).filter (User .password == "mypassword!" ).first ()
83
+ assert len (xray_recorder .current_segment ().subsegments ) == 1
84
+ sql_meta = xray_recorder .current_segment ().subsegments [0 ].sql
85
+ assert sql_meta ['sanitized_query' ].startswith ('SELECT' )
86
+ assert 'FROM users' in sql_meta ['sanitized_query' ]
87
+ assert "mypassword!" not in sql_meta ['sanitized_query' ]
88
+
89
+
90
+ def test_connection_add (connection ):
91
+ password = "123456"
92
+ statement = Insert (User ).values (name = 'John' , fullname = "John Doe" , password = password )
93
+ connection .execute (statement )
94
+ assert len (xray_recorder .current_segment ().subsegments ) == 1
95
+ sql_meta = xray_recorder .current_segment ().subsegments [0 ].sql
96
+ assert sql_meta ['sanitized_query' ].startswith ('INSERT INTO users' )
97
+ assert sql_meta ['url' ] == 'sqlite:///:memory:'
98
+ assert password not in sql_meta ['sanitized_query' ]
99
+
100
+ def test_connection_query (connection ):
101
+ password = "123456"
102
+ statement = Delete (User ).where (User .name == 'John' ).where (User .password == password )
103
+ connection .execute (statement )
104
+ assert len (xray_recorder .current_segment ().subsegments ) == 1
105
+ sql_meta = xray_recorder .current_segment ().subsegments [0 ].sql
106
+ assert sql_meta ['sanitized_query' ].startswith ('DELETE FROM users' )
107
+ assert sql_meta ['url' ] == 'sqlite:///:memory:'
108
+ assert password not in sql_meta ['sanitized_query' ]
0 commit comments