Skip to content

Instantly share code, notes, and snippets.

View goldbergyoni's full-sized avatar
💭
I may be slow to respond

Yoni Goldberg goldbergyoni

💭
I may be slow to respond
View GitHub Profile
@goldbergyoni
goldbergyoni / transfer-service.js
Last active October 3, 2021 18:17
Transfer Service
class TransferService {
async transfer({ id, sender, receiver, transferAmount, bankName }) {
// Validation
if (!sender || !receiver || !transferAmount || !bankName) {
throw new Error("Some mandatory property was not provided");
}
// Handle insufficient credit
if (this.options.creditPolicy === "zero" && sender.credit < transferAmount) {
this.numberOfDeclined++; //incrementing interal metric
@goldbergyoni
goldbergyoni / bettter-test.js
Created April 18, 2021 06:49
Clean tests - Better test
test("When no credit, the declined transfer does not appear in sender history", () => {
// Arrange
const transferRequest = testHelpers.factorMoneyTransfer({
sender: { credit: 50 },
transferAmount: 100,
});
const transferServiceUnderTest = new TransferService({ creditPolicy: "NoCredit" });
// Act
transferServiceUnderTest.transfer(transferRequest);
```
+--------------------+------------------+--------------+-------------+
| Criteria | Clean beforeEach | Transactions | No cleanup |
+--------------------+------------------+--------------+-------------+
| Speed 🏎 | 6 seconds | 7 seconds | 5.5 seconds |
| Troubleshooting 🔍 | One test only | No | All tests |
| Chaos 🐒 | No | No | Yes |
| Multi-process 🚌🚌 | Harder | Easy | Easy |
+--------------------+------------------+--------------+-------------+
```
beforeEach(() => {
db.Orders.destroy({truncate: false, force:true})
});
test("When deleting an existing order, Then the DB should have 0 records", async () => {
// Arrange
const orderToAdd = {
userId: 1,
productId: 2,
invoiceId: `123`, //unique field
};
await request(expressApp).post("/order").send(orderToAdd);
// Act
@goldbergyoni
goldbergyoni / nasty-test.js
Last active October 3, 2021 13:57
Anti-pattern test
// ❌
test('Should fail', () => {
const transferRequest = testHelpers.factorMoneyTransfer({}); // ❌
serviceUnderTest.options.creditPolicy = 'zero'; // ❌
transferRequest.howMuch = 110; // ❌
// Let's use the library sinon to listen to calls to the DB save function
const databaseRepositoryMock = sinon.stub(dbRepository, 'save');//❌
const transferResponse = serviceUnderTest.transfer(transferRequest);
expect(transferResponse.currency).toBe('dollar'); // ❌
expect(transferResponse.id).not.toBeNull(); // ❌
@goldbergyoni
goldbergyoni / db-down.js
Created October 31, 2019 16:40
DB down if CI
afterAll(() => {
if (isCI) {
dockerCompose.down();
}
})
@goldbergyoni
goldbergyoni / grey-box-component-test.js
Created October 29, 2019 15:58
grey-box-component-test
test('When an order error occurs, an email is sent to the admin', () => {
//Arrange
sinon.stub(dataAccessCode , 'saveOrder').throws(new Error('DB save failed'));
const spyOnMailer = sinon.spy(mailer , "sendEmail");
const orderToAdd = {userId: 1, productId: 2, mode: 'approved'};
//Act
const receivedResponse = await request(expressApp).post("/order").send(orderToAdd);
//Assert
@goldbergyoni
goldbergyoni / black-box-component-test.js
Created October 29, 2019 15:54
Black-box component test
test("When adding a new valid order , Then should get back 200 response", async () => {
//Arrange
const orderToAdd = {userId: 1, productId: 2, mode: 'approved'};
nock("http://localhost/user/")
.get(`/1`).reply(200, {
id: 1, name: "John"
});
//Act
const receivedAPIResponse = await superTest(expressApp).post("/order").send(orderToAdd);
@goldbergyoni
goldbergyoni / sinon-sandbox.js
Last active October 31, 2019 15:59
Open mocking sandbox
//Open 'mocking' sandbox
sinonSandbox = sinon.sandbox.create();