diff --git a/packages/ndk/test/mocks/mock_relay.dart b/packages/ndk/test/mocks/mock_relay.dart index f91f3b96b..e20108712 100644 --- a/packages/ndk/test/mocks/mock_relay.dart +++ b/packages/ndk/test/mocks/mock_relay.dart @@ -32,6 +32,7 @@ class MockRelay { bool allwaysSendBadJson; bool sendMalformedEvents; String? customWelcomeMessage; + String? bannedWord; // NIP-46 Remote Signer Support static const int kNip46Kind = BunkerRequest.kKind; @@ -56,6 +57,7 @@ class MockRelay { this.allwaysSendBadJson = false, this.sendMalformedEvents = false, this.customWelcomeMessage, + this.bannedWord, int? explicitPort, }) : _nip65s = nip65s { if (explicitPort != null) { @@ -145,6 +147,16 @@ class MockRelay { if (eventJson[0] == "EVENT") { Nip01Event newEvent = Nip01EventModel.fromJson(eventJson[1]); if (verify(newEvent.pubKey, newEvent.id, newEvent.sig!)) { + // Check if event contains banned word + if (bannedWord != null && newEvent.content.contains(bannedWord!)) { + webSocket.add(jsonEncode([ + "OK", + newEvent.id, + false, + "blocked: content contains banned word" + ])); + return; + } // Check auth for events if required (any authenticated user is OK) if (requireAuthForEvents && authenticatedPubkeys.isEmpty) { webSocket.add(jsonEncode([ diff --git a/packages/ndk/test/usecases/broadcast_sources_test.dart b/packages/ndk/test/usecases/broadcast_sources_test.dart new file mode 100644 index 000000000..b788b6c4b --- /dev/null +++ b/packages/ndk/test/usecases/broadcast_sources_test.dart @@ -0,0 +1,44 @@ +import 'package:ndk/ndk.dart'; +import 'package:ndk/shared/nips/nip01/bip340.dart'; +import 'package:test/test.dart'; + +import '../mocks/mock_event_verifier.dart'; +import '../mocks/mock_relay.dart'; + +void main() async { + test("braodcast should update source", () async { + final relay = MockRelay(name: "relay"); + + await relay.startServer(); + + final ndk = Ndk(NdkConfig( + eventVerifier: MockEventVerifier(), + cache: MemCacheManager(), + bootstrapRelays: [relay.url], + )); + + final keypair = Bip340.generatePrivateKey(); + final signer = Bip340EventSigner( + privateKey: keypair.privateKey, + publicKey: keypair.publicKey, + ); + ndk.accounts.loginExternalSigner(signer: signer); + + final event = Nip01Event( + pubKey: keypair.publicKey, + kind: 1, + tags: [], + content: "content", + ); + + await ndk.broadcast.broadcast(nostrEvent: event).broadcastDoneFuture; + + final localEvent = await ndk.config.cache.loadEvent(event.id); + + expect(localEvent, isNotNull); + expect(localEvent!.sources, isNotEmpty); + + await ndk.destroy(); + await relay.stopServer(); + }); +} diff --git a/packages/ndk/test/usecases/stream_response_cleaner/event_sources_merge_test.dart b/packages/ndk/test/usecases/stream_response_cleaner/event_sources_merge_test.dart new file mode 100644 index 000000000..3a429357f --- /dev/null +++ b/packages/ndk/test/usecases/stream_response_cleaner/event_sources_merge_test.dart @@ -0,0 +1,53 @@ +import 'package:ndk/shared/nips/nip01/bip340.dart'; +import 'package:test/test.dart'; +import 'package:ndk/ndk.dart'; + +import '../../mocks/mock_event_verifier.dart'; +import '../../mocks/mock_relay.dart'; + +void main() async { + test("requests should update sources", () async { + final bannedWord = "cow"; + + final relay1 = MockRelay(name: "relay 1"); + final relay2 = MockRelay(name: "relay 2"); + final relay3 = MockRelay(name: "relay 2", bannedWord: bannedWord); + + await relay1.startServer(); + await relay2.startServer(); + await relay3.startServer(); + + final ndk = Ndk(NdkConfig( + eventVerifier: MockEventVerifier(), + cache: MemCacheManager(), + bootstrapRelays: [relay1.url, relay2.url, relay3.url], + )); + + final keypair = Bip340.generatePrivateKey(); + final signer = Bip340EventSigner( + privateKey: keypair.privateKey, + publicKey: keypair.publicKey, + ); + ndk.accounts.loginExternalSigner(signer: signer); + + final event = Nip01Event( + pubKey: keypair.publicKey, + kind: 1, + tags: [], + content: bannedWord, + ); + await ndk.broadcast.broadcast(nostrEvent: event).broadcastDoneFuture; + + await ndk.config.cache.clearAll(); + + final query = ndk.requests.query(filter: Filter(ids: [event.id])); + final events = await query.future; + + expect(events.first.sources.length, equals(2)); + + await ndk.destroy(); + await relay1.stopServer(); + await relay2.stopServer(); + await relay3.stopServer(); + }); +}