Skip to content

Commit

Permalink
add mysql/postgresql test to github action
Browse files Browse the repository at this point in the history
  • Loading branch information
z-Wind committed Apr 13, 2024
1 parent f022e5e commit 02c8541
Show file tree
Hide file tree
Showing 8 changed files with 563 additions and 481 deletions.
198 changes: 178 additions & 20 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,39 @@ jobs:
- name: Rust Cache dependencies
uses: Swatinem/rust-cache@v2

- name: Clippy without Decimal
- name: Clippy --features sqlite,postgresql,mysql,xml
run: cargo clippy --features sqlite,postgresql,mysql,xml --all-targets -- -D warnings
- name: Clippy with Decimal

- name: Clippy --features sqlite
run: cargo clippy --features sqlite --all-targets -- -D warnings

- name: Clippy --features postgresql
run: cargo clippy --features postgresql --all-targets -- -D warnings

- name: Clippy --features mysql
run: cargo clippy --features mysql --all-targets -- -D warnings

- name: Clippy --features xml
run: cargo clippy --features xml --all-targets -- -D warnings

- name: Clippy --features sqlite,postgresql,mysql,xml,decimal
run: cargo clippy --features sqlite,postgresql,mysql,xml,decimal --all-targets -- -D warnings

- name: Clippy --features sqlite,decimal
run: cargo clippy --features sqlite,decimal --all-targets -- -D warnings

- name: Clippy --features postgresql,decimal
run: cargo clippy --features postgresql,decimal --all-targets -- -D warnings

test:
name: Test
- name: Clippy --features mysql,decimal
run: cargo clippy --features mysql,decimal --all-targets -- -D warnings

- name: Clippy --features xml,decimal
run: cargo clippy --features xml,decimal --all-targets -- -D warnings


test_xml:
name: Test XML
needs: [lint]
runs-on: ${{ matrix.os }}
strategy:
Expand All @@ -50,6 +75,7 @@ jobs:
- ubuntu-latest
- macos-latest
- windows-latest

steps:
- uses: actions/checkout@v4

Expand All @@ -59,24 +85,156 @@ jobs:
- name: Install latest nextest release
uses: taiki-e/install-action@nextest

# - name: Run tests --features sqlite,postgresql,mysql,xml
# run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features sqlite,postgresql,mysql,xml
- name: Run tests --features sqlite
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features sqlite
# - name: Run tests --features postgresql
# run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features postgresql
# - name: Run tests --features mysql
# run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features mysql
- name: Run tests --features xml
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features xml
# - name: Run tests --features sqlite,postgresql,mysql,xml,decimal
# run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features sqlite,postgresql,mysql,xml,decimal
- name: Run tests --features sqlite,decimal
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features sqlite,decimal
# - name: Run tests --features postgresql,decimal
# run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features postgresql,decimal
# - name: Run tests --features mysql,decimal
# run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features mysql,decimal

- name: Run tests --features xml,decimal
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features xml,decimal

- name: Run doc tests
run: |
cargo test --doc --features xml
cargo test --doc --features xml,decimal
test_sqlite:
name: Test SQLite
needs: [lint]
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest

steps:
- uses: actions/checkout@v4

- name: Rust Cache dependencies
uses: Swatinem/rust-cache@v2

- name: Install latest nextest release
uses: taiki-e/install-action@nextest

- name: Check Schema
run: cargo check --features sqlite,schema --all-targets
env:
DATABASE_URL: "sqlite://tests/db/sqlite/complex_sample.gnucash?mode=ro"

- name: Run tests --features sqlite
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features sqlite

- name: Run tests --features sqlite,decimal
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features sqlite,decimal

- name: Run doc tests
run: |
cargo test --doc --features sqlite
cargo test --doc --features sqlite,decimal
test_mysql:
name: Test MySQL
needs: [lint]
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest

services:
mysql:
image: mysql:8.0
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: user
MYSQL_PASSWORD: secret
MYSQL_DATABASE: complex_sample.gnucash
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3

steps:
- uses: actions/checkout@v4

- name: Rust Cache dependencies
uses: Swatinem/rust-cache@v2

- name: Install latest nextest release
uses: taiki-e/install-action@nextest

- name: Prepare Database
run: |
mysql --version
mysql -u user --password=secret --host 127.0.0.1 --port 3306 complex_sample.gnucash < "${{ github.workspace }}/tests/db/mysql/complex_sample.gnucash.sql"
- name: Check Schema
run: cargo check --features mysql,schema --all-targets
env:
DATABASE_URL: "mysql://user:secret@localhost/complex_sample.gnucash"

- name: Run tests --features mysql
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features mysql

- name: Run tests --features mysql,decimal
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features mysql,decimal

- name: Run doc tests
run: |
cargo test --doc --features mysql
cargo test --doc --features mysql,decimal
test_postgresql:
name: Test PostgreSQL
needs: [lint]
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest

services:
postgres:
image: postgres:16.2
env:
POSTGRES_USER: user
POSTGRES_PASSWORD: secret
POSTGRES_DB: complex_sample.gnucash
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4

- name: Rust Cache dependencies
uses: Swatinem/rust-cache@v2

- name: Install latest nextest release
uses: taiki-e/install-action@nextest

- name: Prepare Database
run: |
psql --version
psql -d "postgresql://user:secret@localhost:5432/complex_sample.gnucash" < "${{ github.workspace }}/tests/db/postgresql/complex_sample.gnucash.sql"
- name: Check Schema
run: cargo check --features postgresql,schema --all-targets
env:
DATABASE_URL: "postgresql://user:secret@localhost:5432/complex_sample.gnucash"

- name: Run tests --features postgresql
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features postgresql

- name: Run tests --features postgresql,decimal
run: cargo nextest run --config-file ${{ github.workspace }}/.github/nextest.toml --profile ci --features postgresql,decimal

- name: Run doc tests
run: |
cargo test --doc --features postgresql
cargo test --doc --features postgresql,decimal
21 changes: 11 additions & 10 deletions makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,16 @@ check:
cargo check --features sqlite,postgresql,mysql,xml,decimal --all-targets
cargo clippy --features sqlite,postgresql,mysql,xml,decimal --all-targets
checkschema:
DATABASE_URL=sqlite://tests/db/sqlite/complex_sample.gnucash?mode=ro;
cargo check --features sqlite,schema
DATABASE_URL=mysql://user:secret@localhost/complex_sample.gnucash;
cargo check --features mysql,schema
DATABASE_URL=postgresql://user:secret@localhost:5432/complex_sample.gnucash;
cargo check --features postgresql,schema
export DATABASE_URL=sqlite://tests/db/sqlite/complex_sample.gnucash?mode=ro
cargo check --features sqlite,schema --all-targets
export DATABASE_URL=mysql://user:secret@localhost/complex_sample.gnucash
cargo check --features mysql,schema --all-targets
export DATABASE_URL=postgresql://user:secret@localhost:5432/complex_sample.gnucash
cargo check --features postgresql,schema --all-targets
publish:
cargo publish --all-features
prepare:
cargo sqlx prepare --database-url sqlite://tests/db/sqlite/complex_sample.gnucash?mode=ro -- --tests --features sqlite,schema
cargo sqlx prepare --database-url mysql://user:secret@localhost/complex_sample.gnucash -- --tests --features mysql,schema
cargo sqlx prepare --database-url postgresql://user:secret@localhost:5432/complex_sample.gnucash -- --tests --features postgres,schema
backup:
# Using Gnucash to convert test files into MySQL and PostgreSQL formats,
# then dump them out, and restore them in the testing environment.
pg_dump -U user -f "tests/db/postgresql/complex_sample.gnucash.sql" complex_sample.gnucash
mysqldump -h localhost -u user -p complex_sample.gnucash > "tests/db/mysql/complex_sample.gnucash.sql"
2 changes: 1 addition & 1 deletion src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ pub enum Error {
#[error("I/O error: {0}")]
IO(#[from] std::io::Error),

#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
#[cfg(any(feature = "sqlite", feature = "postgresql", feature = "mysql"))]
#[error("SQLx error: {0}")]
Sql(#[from] sqlx::Error),

Expand Down
84 changes: 72 additions & 12 deletions src/model/account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -276,9 +276,24 @@ mod tests {
let children = account.children().await.unwrap();

assert_eq!(children.len(), 3);
assert_eq!(children[0].name, "Current");
assert_eq!(children[1].name, "Fixed");
assert_eq!(children[2].name, "Broker");
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Current"),
"children does not contains Current"
);
assert!(
children.iter().map(|x| &x.name).any(|name| name == "Fixed"),
"children does not contains Fixed"
);
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Broker"),
"children does not contains Broker"
);
}

#[tokio::test]
Expand Down Expand Up @@ -452,9 +467,24 @@ mod tests {
let children = account.children().await.unwrap();

assert_eq!(children.len(), 3);
assert_eq!(children[0].name, "Current");
assert_eq!(children[1].name, "Fixed");
assert_eq!(children[2].name, "Broker");
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Current"),
"children does not contains Current"
);
assert!(
children.iter().map(|x| &x.name).any(|name| name == "Fixed"),
"children does not contains Fixed"
);
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Broker"),
"children does not contains Broker"
);
}

#[tokio::test]
Expand Down Expand Up @@ -628,9 +658,24 @@ mod tests {
let children = account.children().await.unwrap();

assert_eq!(children.len(), 3);
assert_eq!(children[0].name, "Current");
assert_eq!(children[1].name, "Fixed");
assert_eq!(children[2].name, "Broker");
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Current"),
"children does not contains Current"
);
assert!(
children.iter().map(|x| &x.name).any(|name| name == "Fixed"),
"children does not contains Fixed"
);
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Broker"),
"children does not contains Broker"
);
}

#[tokio::test]
Expand Down Expand Up @@ -809,9 +854,24 @@ mod tests {
let children = account.children().await.unwrap();

assert_eq!(children.len(), 3);
assert_eq!(children[0].name, "Current");
assert_eq!(children[1].name, "Fixed");
assert_eq!(children[2].name, "Broker");
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Current"),
"children does not contains Current"
);
assert!(
children.iter().map(|x| &x.name).any(|name| name == "Fixed"),
"children does not contains Fixed"
);
assert!(
children
.iter()
.map(|x| &x.name)
.any(|name| name == "Broker"),
"children does not contains Broker"
);
}

#[tokio::test]
Expand Down
Loading

0 comments on commit 02c8541

Please sign in to comment.