{"id":18737420,"url":"https://github.com/mikesafonov/smpp-server-mock","last_synced_at":"2025-04-12T19:32:22.740Z","repository":{"id":38451704,"uuid":"234731729","full_name":"MikeSafonov/smpp-server-mock","owner":"MikeSafonov","description":"Mock SMPP server for testing via JUnit 5 extension or Spring Boot Starter and AssertJ","archived":false,"fork":false,"pushed_at":"2023-03-10T14:59:10.000Z","size":222,"stargazers_count":13,"open_issues_count":21,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-23T01:02:28.488Z","etag":null,"topics":["assertj","assertj-assertions","junit5","junit5-extension","smpp","spring-boot","spring-boot-test"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MikeSafonov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-18T12:30:51.000Z","updated_at":"2024-03-26T12:39:13.000Z","dependencies_parsed_at":"2023-02-18T07:45:41.277Z","dependency_job_id":null,"html_url":"https://github.com/MikeSafonov/smpp-server-mock","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MikeSafonov%2Fsmpp-server-mock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MikeSafonov%2Fsmpp-server-mock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MikeSafonov%2Fsmpp-server-mock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MikeSafonov%2Fsmpp-server-mock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MikeSafonov","download_url":"https://codeload.github.com/MikeSafonov/smpp-server-mock/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248621276,"owners_count":21134794,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assertj","assertj-assertions","junit5","junit5-extension","smpp","spring-boot","spring-boot-test"],"created_at":"2024-11-07T15:25:04.422Z","updated_at":"2025-04-12T19:32:22.341Z","avatar_url":"https://github.com/MikeSafonov.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# smpp-server-mock\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=reliability_rating)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=security_rating)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=bugs)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=code_smells)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n\n[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=duplicated_lines_density)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=ncloc)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=MikeSafonov_smpp-server-mock\u0026metric=sqale_index)](https://sonarcloud.io/dashboard?id=MikeSafonov_smpp-server-mock)\n\nThis project helps to write integration test for applications uses SMPP connection. \n\n`smpp-server-mock` comes with:\n\n- Mock SMPP server - [`MockSmppServer`](module-core/src/main/java/com/github/mikesafonov/smpp/server/MockSmppServer.java)\n- Junit 5 extension - [`MockSmppExtension`](module-junit/src/main/java/com/github/mikesafonov/smpp/server/MockSmppExtension.java)\n- Spring Boot Starter to start mock servers before application startup - \n[`MockSmppBootstrapConfiguration`](module-spring-boot/src/main/java/com/github/mikesafonov/smpp/server/MockSmppBootstrapConfiguration.java)\n- AssertJ assertions for core SMPP server objects\n\n## Core \n`smpp-server-mock-core` consist of two main classes: \n[`MockSmppServer`](module-core/src/main/java/com/github/mikesafonov/smpp/server/MockSmppServer.java) and\n[`MockSmppServerHolder`](module-core/src/main/java/com/github/mikesafonov/smpp/server/MockSmppServerHolder.java).\n\n`MockSmppServer` represents smpp server which listening connections, received request, produce response and \nkeep requests in in-memory queue `QueueSmppSessionHandler`.\n\n## Using JUnit 5 extension\n\nAdd `JUnit 5` test dependencies:\n\nMaven:\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.junit.jupiter\u003c/groupId\u003e\n    \u003cartifactId\u003ejunit-jupiter-api\u003c/artifactId\u003e\n    \u003cversion\u003e5.6.0\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\nGradle:\n```\ndependencies{\n    testImplementation(\"org.junit.jupiter:junit-jupiter-api:5.6.0\")\n}\n```\n\nAdd extension dependency `com.github.mikesafonov:smpp-server-mock-junit`:\n\nMaven: \n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.mikesafonov\u003c/groupId\u003e\n    \u003cartifactId\u003esmpp-server-mock-junit\u003c/artifactId\u003e\n    \u003cversion\u003e${version}\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\nGradle:\n\n```\ndependencies{\n    testImplementation(\"com.github.mikesafonov:smpp-server-mock-junit:${version}\")\n}\n```\n\nTest example:\n\n```java\n@ExtendWith(MockSmppExtension.class)\npublic class MyTest {\n    @SmppServer(systemId = \"customSystemId\", password = \"password\")\n    MockSmppServer mockSmppServer;\n    \n    @Test\n    void shouldSendSms(){\n        // create some class to send SMS and connect to mock server, example:\n        MySmsSender sender = new MySmsSender(\"localhost\", mockSmppServer.getPort(), \n                                \"customSystemId\", \"password\");\n        sender.sendSms(\"message\", \"number\");\n        \n        List\u003cSubmitSm\u003e messages = mockSmppServer.getSubmitSmMessages();\n        SubmitSm message = messages.get(0);\n\n        assertEquals(\"number\", message.getDestAddress().getAddress());\n    }       \n}\n```\n\nYou may set `clearAfterTest` to `true` in `SmppServer` if you want to clear all incoming requests after each test run.\n\n`By default` `clearAfterTest` is `false`. \n\n## Using AssertJ assertions\n\n`com.github.mikesafonov:smpp-server-mock-assertj` helps to write more intuitive assertions for SMPP objects.  \n\nTo start using AssertJ assertions you need to:\n\n- add `assertj-core` dependency\n- add `com.github.mikesafonov:smpp-server-mock-assertj` dependency\n\nMaven: \n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.mikesafonov\u003c/groupId\u003e\n    \u003cartifactId\u003esmpp-server-mock-assertj\u003c/artifactId\u003e\n    \u003cversion\u003e${version}\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\nGradle:\n\n```\ndependencies{\n    testImplementation(\"com.github.mikesafonov:smpp-server-mock-assertj:${version}\")\n}\n```\nAssertions for MockSmppServer:\n```\nSmppAssertions.assertThat(mockSmppServer)\n                .hasPort(2000)\n                .hasName(\"myserver\")\n                .hasSystemId(\"systemId\")\n                .hasSingleMessage() // assert for single SubmitSm\n                .hasSingleCancelMessage() // assert for single CancelSm\n                .messages()// assert for list of SubmitSm\n                .cancelMessages()// assert for list of CancelSm\n                .requests();//assert for list of any request\n```\n\nAssertions for SubmitSm:\n```\nSmppAssertions.assertThat(mockSmppServer)\n                    .hasSingleMessage()\n                    .hasDest(\"number\")\n                    .hasText(\"message\")\n                    .hasEsmClass(esmClass)\n                    .hasDeliveryReport()\n                    .doesNotHaveDeliveryReport()\n                    .hasSource(\"someSource\");\n\nor\n\nSmppAssertions.assertThat(submitSm)\n                    .hasDest(\"number\")\n                    .hasText(\"message\")\n                    .hasEsmClass(esmClass)\n                    .hasDeliveryReport()\n                    .doesNotHaveDeliveryReport()\n                    .hasSource(\"someSource\");\n\n```\n\n\nAssertions for CancelSm:\n```\nSmppAssertions.assertThat(mockSmppServer)\n                .hasSingleCancelMessage()\n                .hasDest(\"number\")\n                .hasId(\"messageId\")\n                .hasSource(\"someSource\");\n\nor\n\nSmppAssertions.assertThat(cancelSm)\n                .hasDest(\"number\")\n                .hasId(\"messageId\")\n                .hasSource(\"someSource\");\n```\n\nAssertions for list of SubmitSm:\n```\nSmppAssertions.assertThat(mockSmppServer)\n                .messages()\n                .containsDest(destAddress)\n                .containsText(text)\n                .containsEsmClass(esmClass)\n                .containsSource(sourceAddress);\n\nor\n\nSmppAssertions.assertThatSubmit(listOfSubmitSm)\n                .containsDest(destAddress)\n                .containsText(text)\n                .containsEsmClass(esmClass)\n                .containsSource(sourceAddress);\n\n```\n\nAssertions for list of CancelSm:\n```\nSmppAssertions.assertThat(mockSmppServer)\n                .cancelMessages()\n                .containsDest(destAddress)\n                .containsId(messageId)\n                .containsSource(sourceAddress);\n\nor\n\nSmppAssertions.assertThat(listOfCancelSm)\n                .containsDest(destAddress)\n                .containsId(messageId)\n                .containsSource(sourceAddress);\n```\n\nAssertions for MockSmppServerHolder:\n```\nSmppAssertions.assertThat(holder)\n                .allStarted() // verify that all MockSmppServer started\n                .serverByName(\"first); // find MockSmppServer by name and return assertions\n```\n\n## Using Spring Boot Starter\n\nSpring boot starter are used to bootstrap `MockSmppServer` servers using spring cloud bootstrap phase. \n\nAdd `spring-cloud` and `spring-boot-starter-test` test dependencies:\n\nMaven:\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e\n    \u003cartifactId\u003espring-cloud-starter\u003c/artifactId\u003e\n    \u003cversion\u003ecloud-version\u003c/version\u003e     \n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n    \u003cartifactId\u003espring-boot-starter-test\u003c/artifactId\u003e\n    \u003cversion\u003eversion\u003c/version\u003e     \n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\nGradle:\n```\ndependencies{\n    testImplementation(\"org.springframework.cloud:spring-cloud-starter:${cloud-version}\")\n    testImplementation(\"org.springframework.boot:spring-boot-starter-test:${version}\")\n}\n```\n\nAdd extension dependency `com.github.mikesafonov:smpp-server-mock-spring-boot`:\n\nMaven: \n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.mikesafonov\u003c/groupId\u003e\n    \u003cartifactId\u003esmpp-server-mock-spring-boot\u003c/artifactId\u003e\n    \u003cversion\u003e${version}\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\nGradle:\n\n```\ndependencies{\n    testImplementation(\"com.github.mikesafonov:smpp-server-mock-spring-boot:${version}\")\n}\n```\n\nThe starter consumes properties:\n\n`smpp.mocks.\u003cserver name\u003e.port` (optional, default random)\n\n`smpp.mocks.\u003cserver name\u003e.password`\n\n`smpp.mocks.\u003cserver name\u003e.system-id`\n\nThe starter produces properties:\n\n`smpp.mocks.\u003cserver name\u003e.host` (always `localhost`) \n\n`smpp.mocks.\u003cserver name\u003e.port` \n\n`smpp.mocks.\u003cserver name\u003e.password`\n\n`smpp.mocks.\u003cserver name\u003e.system-id`\n\n#### Example\n\n**bootstrap.properties**:\n```properties\nsmpp.mocks.one.password=test\nsmpp.mocks.one.system-id=user\n```\n\n**application.properties**:\n```properties\n# some properties to smpp connection in your app\nmy.smpp.connection.host=${smpp.mocks.one.host}\nmy.smpp.connection.port=${smpp.mocks.one.port}\nmy.smpp.connection.password=${smpp.mocks.one.password}\nmy.smpp.connection.systemId=${smpp.mocks.one.system-id}\n```\n\n**test**:\n\n```java\n    @SpringBootTest\n    class SingleServer extends BaseSmppTest {\n        @Autowired\n        protected MockSmppServerHolder holder;\n        \n        @Test\n        void shouldRunExpectedSmppServer() {\n            // test logic\n            List\u003cPduRequest\u003e requests = \n                    holder.getByName(\"one\").get().getRequests();\n            // verify smpp requests\n        }\n    }\n```\n\n## Build\n\n### Build from source\n\nYou can build application using following command:\n\n    ./gradlew clean build -x signArchives\n    \n#### Requirements:\n\nJDK \u003e= 1.8\n\n### Unit tests\n\nYou can run unit tests using following command:\n\n    ./gradlew test\n    \n### Mutation tests\n\nYou can run mutation tests using following command:\n\n    ./grdlew pitest\n\nYou will be able to find pitest report in `build/reports/pitest/` folder.\n\n## Contributing\n\nFeel free to contribute. \nNew feature proposals and bug fixes should be submitted as GitHub pull requests. \nFork the repository on GitHub, prepare your change on your forked copy, and submit a pull request.\n\n**IMPORTANT!**\n\u003eBefore contributing please read about [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0-beta.2/) / [Conventional Commits RU](https://www.conventionalcommits.org/ru/v1.0.0-beta.2/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikesafonov%2Fsmpp-server-mock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmikesafonov%2Fsmpp-server-mock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikesafonov%2Fsmpp-server-mock/lists"}