The TimeService module provides time-related functionality for your OpenChat bot. It includes a TimeServiceMock class for testing time-dependent code by allowing you to control and advance time manually.
Resets the mocked time to the current system time.
public func reset() : ()
Example
import TimeService "./backend/TimeService";let timeMock = TimeService.TimeServiceMock();let time1 = timeMock.now();timeMock.advance(1_000_000_000); // Advance by 1 secondlet time2 = timeMock.now();// time2 == time1 + 1_000_000_000timeMock.reset(); // Reset to current system timelet time3 = timeMock.now();// time3 is current system time (likely much greater than time2)
For production code, use Time.now() directly instead of TimeServiceMock:
import Time "mo:base/Time";actor ProductionBot { // Use system time in production public func getCurrentTimestamp() : async Int { Time.now() }; // Check if time has elapsed public func hasElapsed(startTime : Int, duration : Int) : Bool { Time.now() >= startTime + duration };}
Always use TimeServiceMock in your test suites to make tests deterministic:
// Test codelet timeMock = TimeService.TimeServiceMock();let startTime = timeMock.now();// Advance time to test expiration logictimeMock.advance(86_400_000_000_000); // Add 24 hours// Production codelet realTime = Time.now();
Initialize before use
Call now() once before using advance() to initialize the mock:
let timeMock = TimeService.TimeServiceMock();let _ = timeMock.now(); // InitializetimeMock.advance(1_000_000_000); // Now you can advance
Reset between tests
Always reset the mock time between test cases:
// Test 1let time1 = timeMock.now();// ... test logic ...// Reset for Test 2timeMock.reset();let time2 = timeMock.now();// ... test logic ...
Use nanosecond precision
Motoko’s Time module uses nanoseconds since epoch (not milliseconds):
// Correct - nanosecondstimeMock.advance(1_000_000_000); // 1 second// Incorrect - this is only 1 nanosecondtimeMock.advance(1);// Convert from secondslet seconds = 60;timeMock.advance(seconds * 1_000_000_000);
Inject time service for testability
Design your actors to accept a time service for easier testing:
public class MyService(timeService : TimeService) { public func checkExpiration(deadline : Int) : Bool { timeService.now() > deadline };};// Productionlet prodService = MyService({ now = Time.now });// Testinglet mockTime = TimeService.TimeServiceMock();let testService = MyService(mockTime);