Skip to content

Commit 0dea778

Browse files
authored
Merge pull request #19 from SkardiLabs/BtXin/ci_add_integration_tests
Added integration tests
2 parents f8272f5 + 170f644 commit 0dea778

6 files changed

Lines changed: 2055 additions & 33 deletions

File tree

.config/nextest.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[test-groups.user-order-stats]
2+
max-threads = 1
3+
4+
[[profile.default.overrides]]
5+
filter = 'test(test_insert_select_aggregation) | test(test_insert_select_multiple_users)'
6+
test-group = 'user-order-stats'

.github/workflows/ci.yml

Lines changed: 194 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,72 @@ jobs:
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

Comments
 (0)