From 0a8465b7ab3dcf6c342c41fbae83bc03efa9f9b4 Mon Sep 17 00:00:00 2001 From: Edgar Date: Tue, 10 Aug 2021 12:58:00 +1000 Subject: [PATCH 1/5] docs: add readme for typescript --- .../ExtractAndOverrideFactoryMethod/README.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 typescript/ExtractAndOverrideFactoryMethod/README.md diff --git a/typescript/ExtractAndOverrideFactoryMethod/README.md b/typescript/ExtractAndOverrideFactoryMethod/README.md new file mode 100644 index 0000000..16b59b3 --- /dev/null +++ b/typescript/ExtractAndOverrideFactoryMethod/README.md @@ -0,0 +1,26 @@ +# Extract And Override Factory Method + +## Install + +The only requirement needed to run the code is [Dene](https://deno.land/) + +Homebrew (Mac): + +```bash +$ brew install deno +``` + +Other options can be found at [here](https://deno.land/manual@v1.12.1/getting_started/installation) + +## Run the test + +```bash +# Run all tests in the current directory and all sub-directories +deno test + +# Run all tests in the ExtractAndOverrideFactoryMethod directory +deno test ./ExtractAndOverrideFactoryMethod/ + +# Run just my_test.ts +deno test my_test.ts +``` From 7e1860084565a9147d2611de6f184e40e7fd11fa Mon Sep 17 00:00:00 2001 From: Edgar Date: Tue, 10 Aug 2021 12:58:53 +1000 Subject: [PATCH 2/5] feat: conver php code example to typescript --- .../ExtractAndOverrideFactoryMethod/deps.ts | 1 + .../ExtractAndOverrideFactoryMethod/index.ts | 107 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 typescript/ExtractAndOverrideFactoryMethod/deps.ts create mode 100644 typescript/ExtractAndOverrideFactoryMethod/index.ts diff --git a/typescript/ExtractAndOverrideFactoryMethod/deps.ts b/typescript/ExtractAndOverrideFactoryMethod/deps.ts new file mode 100644 index 0000000..7441615 --- /dev/null +++ b/typescript/ExtractAndOverrideFactoryMethod/deps.ts @@ -0,0 +1 @@ +export * as testing from "https://deno.land/std@0.103.0/testing/asserts.ts"; diff --git a/typescript/ExtractAndOverrideFactoryMethod/index.ts b/typescript/ExtractAndOverrideFactoryMethod/index.ts new file mode 100644 index 0000000..d4c0f66 --- /dev/null +++ b/typescript/ExtractAndOverrideFactoryMethod/index.ts @@ -0,0 +1,107 @@ +export namespace App { + class User { + private name: string; + + constructor(name: string) { + this.name = name; + } + + public getName() { + return this.name; + } + } + + class UserRepository { + constructor() {} + + public findByName(name: string) { + return new User(name); + } + } + + class Payment { + private payer: User; + private payee: User; + private cents: number; + + constructor(payer: User, payee: User, cents: number) { + this.payer = payer; + this.payee = payee; + this.cents = cents; + } + + public getPayer(): User { + return this.payer; + } + + public getPayee(): User { + return this.payee; + } + + public getCents(): number { + return this.cents; + } + } + + export class PaymentLedger { + private ledger: Payment[] = []; + + constructor(dBConnection: Library.DBConnection) {} + + public lodge(payment: Payment) { + this.ledger.push(payment); + } + + public getPayment(paymentNumber: number): Payment { + return this.ledger[paymentNumber]; + } + } + + export class PaymentGateway { + private dbConnection: Library.DBConnection; + private repository: UserRepository; + public ledger: PaymentLedger; + + /** + * This hard-coded initialization inside the constructor is the issue we're trying to solve + * + * @memberof PaymentGateway + */ + constructor() { + this.dbConnection = new Library.DBConnection(); + this.repository = new UserRepository(); + this.ledger = new PaymentLedger(this.dbConnection); + } + + /** + * Challenge: + * - Add a currency argument to this method with an appropriate test. + * - Do not use the UserRepository or PaymentLedger to test this class (that would + * take far too long to setup!!) + * - The currency in use before this change was AUD. + * + * @param {string} fromName + * @param {string} toName + * @param {number} cents + * @memberof PaymentGateway + */ + public makePayment(fromName: string, toName: string, cents: number): void { + const fromUser = this.repository.findByName(fromName); + const toUser = this.repository.findByName(toName); + const payment = new Payment(fromUser, toUser, cents); + this.ledger.lodge(payment); + } + } +} + +namespace Library { + export class DBConnection { + public executeCommand(query: string): void { + // ... + } + public executeQuery(query: string): any[] { + // ... + return []; + } + } +} From 2b3ca8d8e63e7c0779ff222316138d762c54aef7 Mon Sep 17 00:00:00 2001 From: Edgar Date: Tue, 10 Aug 2021 13:00:24 +1000 Subject: [PATCH 3/5] tests: add test for example code --- .../index.test.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 typescript/ExtractAndOverrideFactoryMethod/index.test.ts diff --git a/typescript/ExtractAndOverrideFactoryMethod/index.test.ts b/typescript/ExtractAndOverrideFactoryMethod/index.test.ts new file mode 100644 index 0000000..76a594c --- /dev/null +++ b/typescript/ExtractAndOverrideFactoryMethod/index.test.ts @@ -0,0 +1,32 @@ +import { testing } from "./deps.ts"; +import { App } from "./index.ts"; + +const { assertEquals } = testing; + +namespace RunTime { + export class PaymentGateway extends App.PaymentGateway { + public getLedger(): App.PaymentLedger { + return this.ledger; + } + } + + export class PaymentGatewayTest { + public regression(): void { + const paymentGateway = new RunTime.PaymentGateway(); + paymentGateway.makePayment("Me", "You", 100); + const lodgedPayment = paymentGateway.getLedger().getPayment(0); + + Deno.test("must return the payer name", (): void => { + assertEquals("Me", lodgedPayment.getPayer().getName()); + }); + Deno.test("must return the payee name", (): void => { + assertEquals("You", lodgedPayment.getPayee().getName()); + }); + Deno.test("must return the cents", (): void => { + assertEquals(100, lodgedPayment.getCents()); + }); + } + } +} + +new RunTime.PaymentGatewayTest().regression(); From f2663896b891caf0dd4a097a3e94f1a6ae69f097 Mon Sep 17 00:00:00 2001 From: Edgar Date: Tue, 10 Aug 2021 13:01:52 +1000 Subject: [PATCH 4/5] docs: reallocate readme to typescript directory --- typescript/{ExtractAndOverrideFactoryMethod => }/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename typescript/{ExtractAndOverrideFactoryMethod => }/README.md (100%) diff --git a/typescript/ExtractAndOverrideFactoryMethod/README.md b/typescript/README.md similarity index 100% rename from typescript/ExtractAndOverrideFactoryMethod/README.md rename to typescript/README.md From 7ee6841b3ac27c5a25351e850636b0d99daf5652 Mon Sep 17 00:00:00 2001 From: Edgar Date: Tue, 10 Aug 2021 14:09:25 +1000 Subject: [PATCH 5/5] chore: prettier update --- .../ExtractAndOverrideFactoryMethod/deps.ts | 2 +- .../index.test.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/typescript/ExtractAndOverrideFactoryMethod/deps.ts b/typescript/ExtractAndOverrideFactoryMethod/deps.ts index 7441615..f529cf5 100644 --- a/typescript/ExtractAndOverrideFactoryMethod/deps.ts +++ b/typescript/ExtractAndOverrideFactoryMethod/deps.ts @@ -1 +1 @@ -export * as testing from "https://deno.land/std@0.103.0/testing/asserts.ts"; +export * as testing from 'https://deno.land/std@0.103.0/testing/asserts.ts'; diff --git a/typescript/ExtractAndOverrideFactoryMethod/index.test.ts b/typescript/ExtractAndOverrideFactoryMethod/index.test.ts index 76a594c..59ba751 100644 --- a/typescript/ExtractAndOverrideFactoryMethod/index.test.ts +++ b/typescript/ExtractAndOverrideFactoryMethod/index.test.ts @@ -1,5 +1,5 @@ -import { testing } from "./deps.ts"; -import { App } from "./index.ts"; +import { testing } from './deps.ts'; +import { App } from './index.ts'; const { assertEquals } = testing; @@ -13,16 +13,16 @@ namespace RunTime { export class PaymentGatewayTest { public regression(): void { const paymentGateway = new RunTime.PaymentGateway(); - paymentGateway.makePayment("Me", "You", 100); + paymentGateway.makePayment('Me', 'You', 100, 'AUD'); const lodgedPayment = paymentGateway.getLedger().getPayment(0); - Deno.test("must return the payer name", (): void => { - assertEquals("Me", lodgedPayment.getPayer().getName()); + Deno.test('must return the payer name', (): void => { + assertEquals('Me', lodgedPayment.getPayer().getName()); }); - Deno.test("must return the payee name", (): void => { - assertEquals("You", lodgedPayment.getPayee().getName()); + Deno.test('must return the payee name', (): void => { + assertEquals('You', lodgedPayment.getPayee().getName()); }); - Deno.test("must return the cents", (): void => { + Deno.test('must return the cents', (): void => { assertEquals(100, lodgedPayment.getCents()); }); }