1919 test :
2020 name : Test
2121 runs-on : ubuntu-latest
22+
23+ services :
24+ mysql :
25+ image : mysql:8.0
26+ env :
27+ MYSQL_ROOT_PASSWORD : rootpass
28+ MYSQL_DATABASE : mydb
29+ MYSQL_USER : skardi_user
30+ MYSQL_PASSWORD : skardi_pass
31+ ports :
32+ - 3306:3306
33+ options : >-
34+ --health-cmd="mysqladmin ping -h 127.0.0.1 -u root -prootpass"
35+ --health-interval=10s
36+ --health-timeout=5s
37+ --health-retries=5
38+
39+ postgres :
40+ image : postgres:16
41+ env :
42+ POSTGRES_DB : mydb
43+ POSTGRES_USER : skardi_user
44+ POSTGRES_PASSWORD : skardi_pass
45+ ports :
46+ - 5432:5432
47+ options : >-
48+ --health-cmd="pg_isready -U skardi_user -d mydb"
49+ --health-interval=10s
50+ --health-timeout=5s
51+ --health-retries=5
52+
53+ mongo :
54+ image : mongo:7.0
55+ env :
56+ MONGO_INITDB_ROOT_USERNAME : root
57+ MONGO_INITDB_ROOT_PASSWORD : rootpass
58+ ports :
59+ - 27017:27017
60+ options : >-
61+ --health-cmd="mongosh --eval 'db.runCommand({ping:1})' --quiet"
62+ --health-interval=10s
63+ --health-timeout=5s
64+ --health-retries=5
65+
66+ redis :
67+ image : redis:7.4
68+ ports :
69+ - 6379:6379
70+ options : >-
71+ --health-cmd="redis-cli ping"
72+ --health-interval=10s
73+ --health-timeout=5s
74+ --health-retries=5
75+
76+ env :
77+ MYSQL_USER : skardi_user
78+ MYSQL_PASSWORD : skardi_pass
79+ PG_USER : skardi_user
80+ PG_PASSWORD : skardi_pass
81+ MONGO_USER : root
82+ MONGO_PASS : rootpass
83+
2284 steps :
2385 - name : Checkout code
2486 uses : actions/checkout@v4
87+
2588 - name : Install system dependencies
2689 run : |
2790 sudo apt-get update
@@ -46,5 +109,135 @@ jobs:
46109 run : cargo check --all
47110 - name : Execute rust tests
48111 run : cargo nextest run --all-features
49- - name : Execute ignored tests
112+
113+ - name : Install integration test dependencies
114+ run : |
115+ wget -qO- https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
116+ echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
117+ sudo apt-get update
118+ sudo apt-get install -y mongodb-mongosh redis-tools
119+
120+ - name : Seed MySQL data
121+ run : |
122+ mysql -h 127.0.0.1 -u skardi_user -pskardi_pass mydb <<'EOF'
123+ CREATE TABLE users (
124+ id INT PRIMARY KEY AUTO_INCREMENT,
125+ name VARCHAR(100) NOT NULL,
126+ email VARCHAR(100) UNIQUE NOT NULL
127+ );
128+ CREATE TABLE orders (
129+ id INT PRIMARY KEY AUTO_INCREMENT,
130+ user_id INT NOT NULL,
131+ product VARCHAR(100) NOT NULL,
132+ amount DECIMAL(10, 2) NOT NULL
133+ );
134+ CREATE TABLE user_order_stats (
135+ id INT PRIMARY KEY AUTO_INCREMENT,
136+ user_id INT NOT NULL,
137+ user_name VARCHAR(100) NOT NULL,
138+ user_email VARCHAR(100) NOT NULL,
139+ total_orders INT NOT NULL,
140+ total_spent DECIMAL(10, 2) NOT NULL,
141+ last_order_date VARCHAR(50),
142+ UNIQUE KEY unique_user (user_id)
143+ );
144+ INSERT INTO users (name, email) VALUES
145+ ('Alice Smith', 'alice@example.com'),
146+ ('Bob Johnson', 'bob@example.com'),
147+ ('Carol Williams', 'carol@example.com');
148+ INSERT INTO orders (user_id, product, amount) VALUES
149+ (1, 'Laptop', 999.99),
150+ (2, 'Keyboard', 79.99),
151+ (3, 'Monitor', 299.99);
152+ EOF
153+
154+ - name : Seed PostgreSQL data
155+ run : |
156+ PGPASSWORD=skardi_pass psql -h 127.0.0.1 -U skardi_user -d mydb <<'EOF'
157+ CREATE TABLE users (
158+ id SERIAL PRIMARY KEY,
159+ name VARCHAR(100) NOT NULL,
160+ email VARCHAR(100) UNIQUE NOT NULL
161+ );
162+ CREATE TABLE orders (
163+ id SERIAL PRIMARY KEY,
164+ user_id INT NOT NULL,
165+ product VARCHAR(100) NOT NULL,
166+ amount DECIMAL(10, 2) NOT NULL
167+ );
168+ CREATE TABLE user_order_stats (
169+ user_id INT PRIMARY KEY,
170+ user_name VARCHAR(100),
171+ user_email VARCHAR(100),
172+ total_orders INT,
173+ total_spent DECIMAL(10, 2),
174+ last_order_date VARCHAR(50)
175+ );
176+ INSERT INTO users (name, email) VALUES
177+ ('Alice Smith', 'alice@example.com'),
178+ ('Bob Johnson', 'bob@example.com'),
179+ ('Carol Williams', 'carol@example.com');
180+ INSERT INTO orders (user_id, product, amount) VALUES
181+ (1, 'Laptop', 999.99),
182+ (2, 'Keyboard', 79.99),
183+ (3, 'Monitor', 299.99);
184+ EOF
185+
186+ - name : Seed MongoDB data
187+ run : |
188+ mongosh "mongodb://root:rootpass@127.0.0.1:27017/?authSource=admin" <<'EOF'
189+ use mydb
190+
191+ db.createCollection("products", {
192+ validator: {
193+ $jsonSchema: {
194+ bsonType: "object",
195+ required: ["product_id", "name", "price"],
196+ properties: {
197+ product_id: { bsonType: "string" },
198+ name: { bsonType: "string" },
199+ category: { bsonType: "string" },
200+ price: { bsonType: "double" },
201+ in_stock: { bsonType: "bool" }
202+ }
203+ }
204+ }
205+ })
206+
207+ db.products.insertMany([
208+ { _id: "PROD001", product_id: "PROD001", name: "Laptop", category: "Electronics", price: 999.99, in_stock: true },
209+ { _id: "PROD002", product_id: "PROD002", name: "Keyboard", category: "Electronics", price: 79.99, in_stock: true },
210+ { _id: "PROD003", product_id: "PROD003", name: "Monitor", category: "Electronics", price: 299.99, in_stock: false },
211+ { _id: "PROD004", product_id: "PROD004", name: "Mouse", category: "Electronics", price: 29.99, in_stock: true },
212+ { _id: "PROD005", product_id: "PROD005", name: "Desk Chair", category: "Furniture", price: 199.99, in_stock: true }
213+ ])
214+
215+ db.createCollection("product_stats", {
216+ validator: {
217+ $jsonSchema: {
218+ bsonType: "object",
219+ required: ["stat_id"],
220+ properties: {
221+ stat_id: { bsonType: "string" },
222+ category: { bsonType: "string" },
223+ total_products: { bsonType: "long" },
224+ total_value: { bsonType: "double" },
225+ avg_price: { bsonType: "double" }
226+ }
227+ }
228+ }
229+ })
230+ EOF
231+
232+ - name : Seed Redis data
233+ run : |
234+ redis-cli -h 127.0.0.1 <<'EOF'
235+ HSET mydb:products:PROD001 name "Laptop" category "Electronics" price "999.99" in_stock "true"
236+ HSET mydb:products:PROD002 name "Keyboard" category "Electronics" price "79.99" in_stock "true"
237+ HSET mydb:products:PROD003 name "Monitor" category "Electronics" price "299.99" in_stock "false"
238+ HSET mydb:products:PROD004 name "Mouse" category "Electronics" price "29.99" in_stock "true"
239+ HSET mydb:products:PROD005 name "Desk Chair" category "Furniture" price "199.99" in_stock "true"
240+ EOF
241+
242+ - name : Execute Integration tests
50243 run : cargo nextest run --all-features -- --ignored
0 commit comments