Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add e2e testing #62

Merged
merged 4 commits into from
Jul 2, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add e2e testing
JBlixems committed Jul 2, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 55dabe6ae3be9db307d0eee5aee722022fbd2885
23 changes: 1 addition & 22 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

name: Build Codebase
on:
push:
@@ -11,18 +10,8 @@ permissions:
contents: read

jobs:
start:
name: Initial Setup
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Starting Job
run: |
echo "Beginning to Build ${{ github.repository }}"

run_tests:
name: Build Codebase
needs: start
runs-on: ubuntu-latest
steps:
- name: Checkout "${{ github.repository }}"
@@ -39,14 +28,4 @@ jobs:

- name: Build Codebase
run: |
cd CoVAR-app && npm run build

end:
name: The end
runs-on: ubuntu-latest
needs: [start, run_tests]
steps:
- name: Ending
id: init
run: |
echo "${{ github.repository }} has been successfully built"
cd CoVAR-app && npm run build
65 changes: 65 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Cypress E2E Tests
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]

jobs:
e2e-tests:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Set up Docker Compose
uses: docker/setup-buildx-action@v2

- name: Create .env file
run: |
echo PG_USER=${{ secrets.PG_USER }} >> .env
echo PG_HOST=${{ secrets.PG_HOST }} >> .env
echo PG_DATABASE=${{ secrets.PG_DATABASE }} >> .env
echo PG_PASSWORD=${{ secrets.PG_PASSWORD }} >> .env
echo PG_PORT=${{ secrets.PG_PORT }} >> .env
echo JSON_SECRET=${{ secrets.JSON_SECRET }} >> .env
echo REFRESH_SECRET=${{ secrets.REFRESH_SECRET }} >> .env
echo REACT_APP_API_KEY=${{ secrets.REACT_APP_API_KEY }} >> .env
echo REACT_APP_AUTH_DOMAIN=${{ secrets.REACT_APP_AUTH_DOMAIN }} >> .env
echo REACT_APP_PROJECT_ID=${{ secrets.REACT_APP_PROJECT_ID }} >> .env
echo REACT_APP_STORAGE_BUCKET=${{ secrets.REACT_APP_STORAGE_BUCKET }} >> .env
echo REACT_APP_MESSAGING_SENDER_ID=${{ secrets.REACT_APP_MESSAGING_SENDER_ID }} >> .env
echo REACT_APP_APP_ID=${{ secrets.REACT_APP_APP_ID }} >> .env
echo REACT_APP_MEASUREMENT_ID=${{ secrets.REACT_APP_MEASUREMENT_ID }} >> .env

- name: create-json
id: create-json
uses: jsdaniell/create-json@1.1.2
with:
name: "server/covar-7c8b5-firebase-adminsdk-85918-b6654147c1.json"
json: ${{ secrets.FIREBASE_SDK }}

- name: Create DB Schema
run: |
echo ${{ secrets.SCHEMA }} > schema.sql

- name: Clean up any existing Docker containers and networks
run: |
docker-compose down || true
docker container prune -f
docker network prune -f

- name: Build and run Docker Compose services
run: docker-compose up --build -d

- name: Wait for services to be ready
run: |
echo "Waiting for services to be ready..."
sleep 20

- name: Run Cypress tests
run: docker run --network host -v $PWD/CoVAR-app:/CoVAR-app -w /CoVAR-app cypress/included:13.11.0 --config-file cypress.config.js

- name: Shut down Docker Compose services
run: docker-compose down
25 changes: 3 additions & 22 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -2,27 +2,17 @@ name: Lint Codebase
on:
push:
branches: [ main, develop ]

pull_request:
branches: [ main, develop ]
#types: [opened, synchronize, reopened, ready_for_review]

permissions:
contents: read

jobs:
start:
name: Initial Setup
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Starting Job
run: |
echo "Beginning to lint ${{ github.repository }}"

lint_frontend:
name: Lint Frontend
runs-on: ubuntu-latest
needs: start
steps:
- name: Checkout "${{ github.repository }}"
uses: actions/checkout@v3
@@ -37,13 +27,4 @@ jobs:

- name: Lint Codebase
run: |
cd CoVAR-app && npm run lint
end:
name: The end
runs-on: ubuntu-latest
needs: [lint_frontend]
steps:
- name: Ending
id: init
run: |
echo "${{ github.repository }} has been successfully linted"
cd CoVAR-app && npm run lint
23 changes: 1 addition & 22 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

name: Test Codebase
on:
push:
@@ -11,18 +10,8 @@ permissions:
contents: read

jobs:
start:
name: Initial Setup
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Starting Job
run: |
echo "Beginning to test ${{ github.repository }}"

run_tests:
name: Test Codebase
needs: start
runs-on: ubuntu-latest
steps:
- name: Checkout "${{ github.repository }}"
@@ -53,14 +42,4 @@ jobs:
run: |
echo "Coverage Percentage - ${{ steps.coverageComment.outputs.coverage }}"
echo "Coverage Color - ${{ steps.coverageComment.outputs.color }}"
echo "Summary HTML - ${{ steps.coverageComment.outputs.summaryHtml }}"

end:
name: The end
runs-on: ubuntu-latest
needs: [start, run_tests]
steps:
- name: Ending
id: init
run: |
echo "${{ github.repository }} has passed all tests"
echo "Summary HTML - ${{ steps.coverageComment.outputs.summaryHtml }}"
15 changes: 15 additions & 0 deletions CoVAR-app/cypress.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const { defineConfig } = require("cypress");

module.exports = defineConfig({
e2e: {
baseUrl: "http://localhost:3050",
setupNodeEvents(on, config) {
on('task', {
logDOM(domString) {
console.log(domString);
return null;
}
});
},
},
});
30 changes: 30 additions & 0 deletions CoVAR-app/cypress/e2e/login.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
describe('Login E2E Tests', () => {
beforeEach(() => {
cy.visit('/login')
})

it('displays the entire DOM for debugging', () => {
cy.document().then((doc) => {
const domString = doc.documentElement.outerHTML;
cy.task('logDOM', domString);
});
});

it('displays an error message with incorrect credentials', () => {
cy.get('input[name="email"]', { timeout: 4000 }).type('wronguser@something.com')
cy.get('input[name="password"]').type('wrongpassword')
cy.get('button[type="submit"]').click()

cy.wait(1000)
cy.get('#error').should("have.text", 'Failed to sign in. Please check your credentials.')
})

it('successfully logs in with correct credentials', () => {
cy.get('input[name="email"]', { timeout: 4000 }).type('jfmalan1@gmail.com')
cy.get('input[name="password"]').type('Password')
cy.get('button[type="submit"]').click()

cy.url().should('include', '/')
})

})
5 changes: 3 additions & 2 deletions CoVAR-app/package.json
Original file line number Diff line number Diff line change
@@ -15,21 +15,22 @@
"@types/node": "^16.18.97",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"axios": "^0.24.0",
"firebase": "^10.12.2",
"i": "^0.3.7",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^6.23.1",
"recharts": "^2.12.7",
"typescript": "^4.9.5",
"web-vitals": "^2.1.4",
"axios": "^0.24.0"
"web-vitals": "^2.1.4"
},
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.16.7",
"@testing-library/react": "^15.0.7",
"@typescript-eslint/eslint-plugin": "^7.11.0",
"@typescript-eslint/parser": "^7.11.0",
"cypress": "^13.11.0",
"eslint": "^8.57.0",
"eslint-plugin-react": "^7.34.2",
"react-scripts": "5.0.1"
3 changes: 1 addition & 2 deletions CoVAR-app/src/login/loginForm.tsx
Original file line number Diff line number Diff line change
@@ -168,7 +168,6 @@ const Login: React.FC<LoginProps> = ({ toggleForm }) => {
throw new Error('Failed to create user in PostgreSQL');
}
} catch (error) {
console.error("Sign-in with Google failed:", error);
setIsSigningIn(false);
setError('Failed to sign in with Google.');
}
@@ -278,7 +277,7 @@ const Login: React.FC<LoginProps> = ({ toggleForm }) => {
</Link>
</Box>
{error && (
<Typography variant="body2" color="error" sx={{ mt: 2 }}>
<Typography variant="body2" color="error" id="error" sx={{ mt: 2 }}>
{error}
</Typography>
)}
127 changes: 127 additions & 0 deletions Documentation/Assets/Architecture.drawio
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<mxfile host="app.diagrams.net" modified="2024-07-01T09:57:26.869Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" etag="KplgaaUqFQRcmYbCl8ij" version="24.6.2" type="device">
<diagram name="Page-1" id="JkGz3EWr7mH9SGlrHtyQ">
<mxGraphModel dx="2261" dy="778" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="hBgB5WNWqoKUX2ORy7uX-1" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-20" y="90" width="1020" height="620" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-2" target="hBgB5WNWqoKUX2ORy7uX-5">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-2" value="&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Client&lt;/font&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="310" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="480" y="150" width="440" height="510" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-4" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;Server&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="660" y="150" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-5" value="&lt;b&gt;&lt;font style=&quot;font-size: 14px;&quot;&gt;Gatekeeper&lt;/font&gt;&lt;/b&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="260" y="310" width="110" height="60" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-5">
<mxGeometry relative="1" as="geometry">
<mxPoint x="481" y="340" as="targetPoint" />
<Array as="points">
<mxPoint x="481" y="340" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-11" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;//&lt;/b&gt;&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="hBgB5WNWqoKUX2ORy7uX-7">
<mxGeometry x="-0.0693" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-8" target="hBgB5WNWqoKUX2ORy7uX-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-27" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;Get modelled data&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="hBgB5WNWqoKUX2ORy7uX-25">
<mxGeometry x="0.1701" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-8" value="Data" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="680" y="540" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-9" value="Gatekeeper&amp;nbsp; exposes endpoints to clients" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="180" y="260" width="60" height="70" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-12" value="Restful API Endpoints" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="500" y="310" width="110" height="60" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-21" value="Gatekeeper may be decoupled from trusted hosts" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="390" y="260" width="70" height="70" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-22" value="HTTPS&lt;div&gt;JWT Tokens&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="175" y="350" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-23" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="670" y="190" width="190" height="330" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=0;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-12" target="hBgB5WNWqoKUX2ORy7uX-13">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="630" y="340" />
<mxPoint x="630" y="260" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-28" value="&lt;b&gt;Upload reports&lt;/b&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="hBgB5WNWqoKUX2ORy7uX-16">
<mxGeometry x="-0.1765" y="-1" relative="1" as="geometry">
<mxPoint x="-11" y="-10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-13" value="Scan reports" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="700" y="230" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-14" value="Standardize" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="700" y="320" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-15" value="Model data" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="700" y="420" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-15" target="hBgB5WNWqoKUX2ORy7uX-8">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="760" y="500" />
<mxPoint x="710" y="500" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-20" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;Store&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="hBgB5WNWqoKUX2ORy7uX-19">
<mxGeometry x="-0.05" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=none;startFill=0;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-13" target="hBgB5WNWqoKUX2ORy7uX-14">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-29" value="Valid reports" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="hBgB5WNWqoKUX2ORy7uX-17">
<mxGeometry x="-0.1333" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-14" target="hBgB5WNWqoKUX2ORy7uX-15">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-30" value="Standardized report" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="hBgB5WNWqoKUX2ORy7uX-18">
<mxGeometry x="-0.3333" relative="1" as="geometry">
<mxPoint y="7" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-24" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;Pipe and filter&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="710" y="190" width="100" height="30" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-31" value="&lt;font style=&quot;font-size: 14px;&quot;&gt;&lt;b&gt;CoVAR System&lt;/b&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="414" y="90" width="110" height="30" as="geometry" />
</mxCell>
<mxCell id="hBgB5WNWqoKUX2ORy7uX-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=-0.002;entryY=0.373;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="hBgB5WNWqoKUX2ORy7uX-12" target="hBgB5WNWqoKUX2ORy7uX-3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
4 changes: 2 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -45,7 +45,7 @@ services:
stdin_open: true
build:
dockerfile: Dockerfile.dev
context: './covar-app'
context: './CoVAR-app'
environment:
- REACT_APP_API_KEY=${REACT_APP_API_KEY}
- REACT_APP_AUTH_DOMAIN=${REACT_APP_AUTH_DOMAIN}
@@ -56,7 +56,7 @@ services:
- REACT_APP_MEASUREMENT_ID=${REACT_APP_MEASUREMENT_ID}
volumes:
- /app/node_modules
- ./covar-app:/app
- ./CoVAR-app:/app

volumes:
postgres_data: