commit 721afae5d5a114ac26585fc0282847a2853db48c Author: sova-bootstrap Date: Wed May 27 19:36:34 2026 +0300 chore: initial import for test contour diff --git a/charts/mocks/Chart.yaml b/charts/mocks/Chart.yaml new file mode 100644 index 0000000..cedf4fd --- /dev/null +++ b/charts/mocks/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: sova-mocks +description: WireMock and Mailpit for test contour +type: application +version: 0.1.0 +appVersion: "1.0.0" diff --git a/charts/mocks/mappings/calltouch-lead-create.json b/charts/mocks/mappings/calltouch-lead-create.json new file mode 100644 index 0000000..54ddc8e --- /dev/null +++ b/charts/mocks/mappings/calltouch-lead-create.json @@ -0,0 +1,17 @@ +{ + "request": { + "method": "POST", + "urlPath": "/lead-service/v1/api/request/create" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": { + "leadId": "mock-lead-456" + } + } + } +} diff --git a/charts/mocks/mappings/captcha-validate.json b/charts/mocks/mappings/captcha-validate.json new file mode 100644 index 0000000..08db22c --- /dev/null +++ b/charts/mocks/mappings/captcha-validate.json @@ -0,0 +1,16 @@ +{ + "request": { + "method": "POST", + "urlPath": "/validate" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "status": "ok", + "message": "" + } + } +} diff --git a/charts/mocks/mappings/mis-anonymous-reserve.json b/charts/mocks/mappings/mis-anonymous-reserve.json new file mode 100644 index 0000000..2014162 --- /dev/null +++ b/charts/mocks/mappings/mis-anonymous-reserve.json @@ -0,0 +1,19 @@ +{ + "request": { + "method": "POST", + "urlPath": "/api/reservation/anonymous-reserve" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "status": "ok", + "data": { + "reservationId": "mock-reservation-123", + "message": "Mock reservation created" + } + } + } +} diff --git a/charts/mocks/mappings/mis-filials-list.json b/charts/mocks/mappings/mis-filials-list.json new file mode 100644 index 0000000..043477b --- /dev/null +++ b/charts/mocks/mappings/mis-filials-list.json @@ -0,0 +1,21 @@ +{ + "request": { + "method": "GET", + "urlPath": "/filials/list" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "id": 1, + "name": "Test Filial", + "address": "г. Саратов, ул. Тестовая, д. 1" + } + ] + } + } +} diff --git a/charts/mocks/mappings/mis-intervals.json b/charts/mocks/mappings/mis-intervals.json new file mode 100644 index 0000000..2a7d27e --- /dev/null +++ b/charts/mocks/mappings/mis-intervals.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "GET", + "urlPath": "/api/reservation/intervals" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "workdates": [ + { + "2026-05-28": [ + { + "depnum": 10, + "intervals": [ + { "isFree": true, "time": "10:00", "duration": 30 }, + { "isFree": false, "time": "10:30", "duration": 30 } + ] + } + ] + } + ] + } + ] + } + } +} diff --git a/charts/mocks/mappings/mis-pricelist-departments.json b/charts/mocks/mappings/mis-pricelist-departments.json new file mode 100644 index 0000000..466626d --- /dev/null +++ b/charts/mocks/mappings/mis-pricelist-departments.json @@ -0,0 +1,22 @@ +{ + "request": { + "method": "GET", + "urlPath": "/pricelist/departments" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "id": 10, + "name": "Test Department", + "viewInWeb": 1, + "schCount": 5 + } + ] + } + } +} diff --git a/charts/mocks/mappings/mis-pricelist-list.json b/charts/mocks/mappings/mis-pricelist-list.json new file mode 100644 index 0000000..bc5fee1 --- /dev/null +++ b/charts/mocks/mappings/mis-pricelist-list.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "GET", + "urlPath": "/pricelist/list" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "kodoper": "1001", + "schname": "Test service", + "specname": "Test specialist", + "speccode": 101, + "priceInfo": 1500, + "discpercent": 0, + "discprice": 1500, + "structname": "Test dept", + "fname": "Test Filial", + "filial": 1, + "comment": "", + "mediaId": null + } + ], + "total": 1 + } + } +} diff --git a/charts/mocks/templates/all.yaml b/charts/mocks/templates/all.yaml new file mode 100644 index 0000000..1355f81 --- /dev/null +++ b/charts/mocks/templates/all.yaml @@ -0,0 +1,105 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: wiremock-mappings + namespace: {{ .Values.namespace }} +data: +{{- range $path, $_ := .Files.Glob "mappings/*.json" }} + {{ base $path }}: | +{{ $.Files.Get $path | indent 4 }} +{{- end }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mis-mock + namespace: {{ .Values.namespace }} +spec: + replicas: 1 + selector: + matchLabels: + app: mis-mock + template: + metadata: + labels: + app: mis-mock + spec: + containers: + - name: wiremock + image: {{ .Values.wiremock.image }} + args: ["--global-response-templating"] + ports: + - containerPort: {{ .Values.wiremock.port }} + volumeMounts: + - name: mappings + mountPath: /home/wiremock/mappings + resources: + requests: + cpu: 50m + memory: 128Mi + limits: + cpu: 200m + memory: 256Mi + volumes: + - name: mappings + configMap: + name: wiremock-mappings +--- +apiVersion: v1 +kind: Service +metadata: + name: mis-mock + namespace: {{ .Values.namespace }} +spec: + selector: + app: mis-mock + ports: + - port: {{ .Values.wiremock.port }} + targetPort: {{ .Values.wiremock.port }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mailpit + namespace: {{ .Values.namespace }} +spec: + replicas: 1 + selector: + matchLabels: + app: mailpit + template: + metadata: + labels: + app: mailpit + spec: + containers: + - name: mailpit + image: {{ .Values.mailpit.image }} + ports: + - containerPort: {{ .Values.mailpit.smtpPort }} + name: smtp + - containerPort: {{ .Values.mailpit.uiPort }} + name: ui + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 200m + memory: 128Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: mailpit + namespace: {{ .Values.namespace }} +spec: + selector: + app: mailpit + ports: + - name: smtp + port: {{ .Values.mailpit.smtpPort }} + targetPort: smtp + - name: ui + port: {{ .Values.mailpit.uiPort }} + targetPort: ui diff --git a/charts/mocks/values.yaml b/charts/mocks/values.yaml new file mode 100644 index 0000000..f898206 --- /dev/null +++ b/charts/mocks/values.yaml @@ -0,0 +1,10 @@ +namespace: sova-mocks + +wiremock: + image: wiremock/wiremock:3.9.1 + port: 8080 + +mailpit: + image: axllent/mailpit:v1.21 + smtpPort: 1025 + uiPort: 8025 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..26f90ae --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +services: + wiremock: + image: wiremock/wiremock:3.9.1 + ports: + - "8080:8080" + volumes: + - ./wiremock/mappings:/home/wiremock/mappings:ro + command: ["--global-response-templating", "--verbose"] + + mailpit: + image: axllent/mailpit:v1.21 + ports: + - "1025:1025" + - "8025:8025" diff --git a/scripts/smoke-local.sh b/scripts/smoke-local.sh new file mode 100755 index 0000000..4845832 --- /dev/null +++ b/scripts/smoke-local.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +docker compose up -d --wait 2>/dev/null || docker-compose up -d + +sleep 2 +curl -sf "http://localhost:8080/api/reservation/intervals?doctor=1" | grep -q workdates && echo "OK mis-intervals" +curl -sf -X POST "http://localhost:8080/api/reservation/anonymous-reserve" \ + -H "Content-Type: application/json" -d '{"test":true}' | grep -q reservationId && echo "OK anonymous-reserve" +curl -sf -X POST "http://localhost:8080/validate" | grep -q '"status"' && echo "OK captcha" + +echo "Mock smoke passed." diff --git a/wiremock/mappings/calltouch-lead-create.json b/wiremock/mappings/calltouch-lead-create.json new file mode 100644 index 0000000..54ddc8e --- /dev/null +++ b/wiremock/mappings/calltouch-lead-create.json @@ -0,0 +1,17 @@ +{ + "request": { + "method": "POST", + "urlPath": "/lead-service/v1/api/request/create" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": { + "leadId": "mock-lead-456" + } + } + } +} diff --git a/wiremock/mappings/captcha-validate.json b/wiremock/mappings/captcha-validate.json new file mode 100644 index 0000000..08db22c --- /dev/null +++ b/wiremock/mappings/captcha-validate.json @@ -0,0 +1,16 @@ +{ + "request": { + "method": "POST", + "urlPath": "/validate" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "status": "ok", + "message": "" + } + } +} diff --git a/wiremock/mappings/mis-anonymous-reserve.json b/wiremock/mappings/mis-anonymous-reserve.json new file mode 100644 index 0000000..2014162 --- /dev/null +++ b/wiremock/mappings/mis-anonymous-reserve.json @@ -0,0 +1,19 @@ +{ + "request": { + "method": "POST", + "urlPath": "/api/reservation/anonymous-reserve" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "status": "ok", + "data": { + "reservationId": "mock-reservation-123", + "message": "Mock reservation created" + } + } + } +} diff --git a/wiremock/mappings/mis-filials-list.json b/wiremock/mappings/mis-filials-list.json new file mode 100644 index 0000000..043477b --- /dev/null +++ b/wiremock/mappings/mis-filials-list.json @@ -0,0 +1,21 @@ +{ + "request": { + "method": "GET", + "urlPath": "/filials/list" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "id": 1, + "name": "Test Filial", + "address": "г. Саратов, ул. Тестовая, д. 1" + } + ] + } + } +} diff --git a/wiremock/mappings/mis-intervals.json b/wiremock/mappings/mis-intervals.json new file mode 100644 index 0000000..2a7d27e --- /dev/null +++ b/wiremock/mappings/mis-intervals.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "GET", + "urlPath": "/api/reservation/intervals" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "workdates": [ + { + "2026-05-28": [ + { + "depnum": 10, + "intervals": [ + { "isFree": true, "time": "10:00", "duration": 30 }, + { "isFree": false, "time": "10:30", "duration": 30 } + ] + } + ] + } + ] + } + ] + } + } +} diff --git a/wiremock/mappings/mis-pricelist-departments.json b/wiremock/mappings/mis-pricelist-departments.json new file mode 100644 index 0000000..466626d --- /dev/null +++ b/wiremock/mappings/mis-pricelist-departments.json @@ -0,0 +1,22 @@ +{ + "request": { + "method": "GET", + "urlPath": "/pricelist/departments" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "id": 10, + "name": "Test Department", + "viewInWeb": 1, + "schCount": 5 + } + ] + } + } +} diff --git a/wiremock/mappings/mis-pricelist-list.json b/wiremock/mappings/mis-pricelist-list.json new file mode 100644 index 0000000..bc5fee1 --- /dev/null +++ b/wiremock/mappings/mis-pricelist-list.json @@ -0,0 +1,31 @@ +{ + "request": { + "method": "GET", + "urlPath": "/pricelist/list" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "jsonBody": { + "data": [ + { + "kodoper": "1001", + "schname": "Test service", + "specname": "Test specialist", + "speccode": 101, + "priceInfo": 1500, + "discpercent": 0, + "discprice": 1500, + "structname": "Test dept", + "fname": "Test Filial", + "filial": 1, + "comment": "", + "mediaId": null + } + ], + "total": 1 + } + } +}