Last time we have to implement the requirement:
Meeting Obsolete:
The meeting is available for 35 minutes. After that,meeting is not available anymore.
We did so for the 35 minutes. But we did not for the last sentence – meeting is not available anymore. There are 2 points here: of design ( do not retrieve meeting ) and enforcing that no participant can write to the meeting.
So we modify the functions AddParticipant,CheckCardByParticipant to raise an exception if the meeting is obsolete .( As a side effect of identifying the functions that make actions in the opposite of functions that just reports,I think about structuring code in CQRS form )
Now for TypeScript we have 2 options :
- Construct a class that inherits from Error
- Modify the response type of those function to a combined type of result and error
For the first one,we should take care of TypeScript syntax of creating errors: See https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html and https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
class CustomError extends Error {
constructor(message?: string) {
super(message);
// ‘Error’ breaks prototype chain here
Object.setPrototypeOf(this,new.target.prototype); // restore prototype chain
}
}
For the second,we could do ourselves or use a npm package such as https://github.com/gDelgado14/neverthrow
I decide to go to the second. I have too many times use the first thing in C# – it is time to have something new. Anyway,this is the code now
import { ok,err,Result } from 'neverthrow'; //code public CheckCardByParticipant(c: Cards,p:Participant): Result<Meeting,Error>{ //TODO: verify participant is added first or add //TODO: verify card is added first if(this.IsObsolete()){ return err(new Error(`cannot check card to the obsolete meeting ${this.Id}`)); } c.CheckMe(p); return ok(this); } //code public AddParticipant(p:Participant ): Result<number,Error>{ if(this.IsObsolete()){ return err(new Error(`cannot add participant to the obsolete meeting ${this.Id}`)); } this.Participants.push(p); return ok(this.Participants.length); }
and those are the tests
const mf=new MeetingsFactory(); const m1=mf.CreateMeeting("andrei","first meeting"); const now = Date.now(); const spy = jest.spyOn(Date,'now'); spy.mockImplementation(()=>{ console.log('calling DateTime Now'); return now + 36 * 60* 1000; } ); expect(m1.IsObsolete()).toBe(true); const p=new Participant(); p.Id=70; p.Name ="alexandru"; const res= m1.AddParticipant(p); expect(res.isOk()).toBe(false); spy.mockRestore();
Leave a Reply