From 8ca7481a791224a17ff00d1d8a553daf951897eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Wed, 22 Apr 2026 09:03:38 +0400 Subject: [PATCH] Mock nostr service globally in tests --- app/components/map.gjs | 2 +- tests/helpers/index.js | 4 ++ tests/helpers/mock-nostr.js | 96 +++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 tests/helpers/mock-nostr.js diff --git a/app/components/map.gjs b/app/components/map.gjs index 1dc567d..5b0877b 100644 --- a/app/components/map.gjs +++ b/app/components/map.gjs @@ -1034,7 +1034,7 @@ export default class MapComponent extends Component { } handleMapMove = async () => { - if (!this.mapInstance) return; + if (!this.mapInstance || this.isDestroying || this.isDestroyed) return; const view = this.mapInstance.getView(); const center = toLonLat(view.getCenter()); diff --git a/tests/helpers/index.js b/tests/helpers/index.js index ab04c16..7727daa 100644 --- a/tests/helpers/index.js +++ b/tests/helpers/index.js @@ -3,6 +3,7 @@ import { setupRenderingTest as upstreamSetupRenderingTest, setupTest as upstreamSetupTest, } from 'ember-qunit'; +import { setupNostrMocks } from './mock-nostr'; // This file exists to provide wrappers around ember-qunit's // test setup functions. This way, you can easily extend the setup that is @@ -10,6 +11,7 @@ import { function setupApplicationTest(hooks, options) { upstreamSetupApplicationTest(hooks, options); + setupNostrMocks(hooks); // Additional setup for application tests can be done here. // @@ -29,12 +31,14 @@ function setupApplicationTest(hooks, options) { function setupRenderingTest(hooks, options) { upstreamSetupRenderingTest(hooks, options); + setupNostrMocks(hooks); // Additional setup for rendering tests can be done here. } function setupTest(hooks, options) { upstreamSetupTest(hooks, options); + setupNostrMocks(hooks); // Additional setup for unit tests can be done here. } diff --git a/tests/helpers/mock-nostr.js b/tests/helpers/mock-nostr.js new file mode 100644 index 0000000..00d9a5a --- /dev/null +++ b/tests/helpers/mock-nostr.js @@ -0,0 +1,96 @@ +import Service from '@ember/service'; +import { tracked } from '@glimmer/tracking'; +import { Promise } from 'rsvp'; + +export class MockNostrAuthService extends Service { + @tracked pubkey = null; + @tracked signerType = null; + @tracked connectStatus = null; + @tracked connectUri = null; + + get isConnected() { + return false; + } + + get isMobile() { + return false; + } + + get signer() { + return null; + } + + async connectWithExtension() { + return Promise.resolve(); + } + + async connectWithApp() { + return Promise.resolve(); + } + + disconnect() {} +} + +export class MockNostrDataService extends Service { + @tracked profile = null; + @tracked mailboxes = null; + @tracked blossomServers = []; + @tracked placePhotos = []; + + store = { + add: () => {}, + }; + + get activeReadRelays() { + return []; + } + + get activeWriteRelays() { + return []; + } + + get defaultReadRelays() { + return []; + } + + get defaultWriteRelays() { + return []; + } + + get userDisplayName() { + return 'Mock User'; + } + + loadPlacesInBounds() { + return Promise.resolve(); + } + + loadPhotosForPlace() { + return Promise.resolve(); + } + + loadPlacePhotos() { + return Promise.resolve(); + } +} + +export class MockNostrRelayService extends Service { + pool = { + publish: () => Promise.resolve([{ ok: true }]), + subscribe: () => {}, + unsubscribe: () => {}, + close: () => {}, + }; + + async publish() { + return [{ ok: true }]; + } +} + +export function setupNostrMocks(hooks) { + hooks.beforeEach(function () { + this.owner.register('service:nostrAuth', MockNostrAuthService); + this.owner.register('service:nostrData', MockNostrDataService); + this.owner.register('service:nostrRelay', MockNostrRelayService); + }); +}