mirror of
https://github.com/Cameri/nostream.git
synced 2025-03-18 05:41:49 +01:00
fix: integration tests
This commit is contained in:
parent
1db3343ef8
commit
dbf8a7f345
@ -19,13 +19,6 @@ export class DeleteEventStrategy implements IEventStrategy<Event, Promise<void>>
|
||||
public async execute(event: Event): Promise<void> {
|
||||
debug('received delete event: %o', event)
|
||||
|
||||
const count = await this.eventRepository.create(event)
|
||||
this.webSocket.emit(WebSocketAdapterEvent.Message, createCommandResult(event.id, true, (count) ? '' : 'duplicate:'))
|
||||
|
||||
if (count) {
|
||||
this.webSocket.emit(WebSocketAdapterEvent.Broadcast, event)
|
||||
}
|
||||
|
||||
const isValidETag = (tag: Tag) =>
|
||||
tag.length >= 2
|
||||
&& tag[0] === EventTags.Event
|
||||
@ -50,5 +43,12 @@ export class DeleteEventStrategy implements IEventStrategy<Event, Promise<void>>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const count = await this.eventRepository.create(event)
|
||||
this.webSocket.emit(WebSocketAdapterEvent.Message, createCommandResult(event.id, true, (count) ? '' : 'duplicate:'))
|
||||
|
||||
if (count) {
|
||||
this.webSocket.emit(WebSocketAdapterEvent.Broadcast, event)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -231,18 +231,21 @@ export class EventRepository implements IEventRepository {
|
||||
}
|
||||
|
||||
public insertStubs(pubkey: string, eventIdsToDelete: EventId[]): Promise<number> {
|
||||
debug('inserting stubs for %s: %o', pubkey, eventIdsToDelete)
|
||||
const date = new Date()
|
||||
return this.dbClient('events').insert(
|
||||
eventIdsToDelete.map(
|
||||
applySpec({
|
||||
event_id: pipe(identity, toBuffer),
|
||||
event_pubkey: pipe(always(pubkey), toBuffer),
|
||||
event_created_at: always(Math.floor(Date.now() / 1000)),
|
||||
event_created_at: always(Math.floor(date.getTime() / 1000)),
|
||||
event_kind: always(5),
|
||||
event_tags: always('[]'),
|
||||
event_content: always(''),
|
||||
event_signature: pipe(always(''), toBuffer),
|
||||
event_delegator: always(null),
|
||||
event_deduplication: pipe(always([pubkey, 5]), toJSON),
|
||||
deleted_at: always(date),
|
||||
})
|
||||
)
|
||||
)
|
||||
|
@ -63,7 +63,6 @@ Feature: NIP-01
|
||||
Given someone called Alice
|
||||
And someone called Bob
|
||||
And someone called Charlie
|
||||
|
||||
When Bob sends a text_note event with content "I'm Bob"
|
||||
And Bob subscribes to author Bob
|
||||
And Bob receives a text_note event from Bob with content "I'm Bob"
|
||||
@ -73,6 +72,7 @@ Feature: NIP-01
|
||||
And Alice subscribes to text_note events from Bob and set_metadata events from Charlie
|
||||
Then Alice receives 2 events from Bob and Charlie
|
||||
|
||||
@test
|
||||
Scenario: Alice is interested in Bob's events from back in November
|
||||
Given someone called Alice
|
||||
And someone called Bob
|
||||
@ -92,5 +92,3 @@ Feature: NIP-01
|
||||
And Bob receives a text_note event from Bob with content "Three"
|
||||
When Alice subscribes to author Bob with a limit of 2
|
||||
Then Alice receives 2 text_note events from Bob and EOSE
|
||||
|
||||
|
||||
|
@ -129,7 +129,7 @@ When(/^(\w+) sends a text_note event with content "([^"]+)" on (\d+)$/, async fu
|
||||
|
||||
const event: Event = await createEvent({ pubkey, kind: 1, content, created_at: Number(createdAt) }, privkey)
|
||||
|
||||
await sendEvent(ws, event)
|
||||
await sendEvent(ws, event, true)
|
||||
this.parameters.events[name].push(event)
|
||||
})
|
||||
|
||||
@ -170,8 +170,10 @@ Then(/(\w+) receives a text_note event from (\w+) with content "([^"]+?)"/, asyn
|
||||
const ws = this.parameters.clients[name] as WebSocket
|
||||
const subscription = this.parameters.subscriptions[name][this.parameters.subscriptions[name].length - 1]
|
||||
const receivedEvent = await waitForNextEvent(ws, subscription.name, content)
|
||||
|
||||
console.log('receivedEvent', receivedEvent)
|
||||
expect(receivedEvent.kind).to.equal(1)
|
||||
console.log('name', name, this.parameters.identities[name].pubkey)
|
||||
console.log('author', author, this.parameters.identities[author].pubkey)
|
||||
expect(receivedEvent.pubkey).to.equal(this.parameters.identities[author].pubkey)
|
||||
expect(receivedEvent.content).to.equal(content)
|
||||
})
|
||||
|
@ -30,9 +30,5 @@ Feature: NIP-28
|
||||
And Alice receives a channel_creation event from Alice with content '{\"name\": \"Original\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\"}'
|
||||
And Alice sends a channel_metadata event with content '{\"name\": \"New\", \"about\": \"A better test channel.\", \"picture\": \"https://placekitten.com/256/256\"}'
|
||||
And Alice receives a channel_metadata event from Alice with content '{\"name\": \"New\", \"about\": \"A better test channel.\", \"picture\": \"https://placekitten.com/256/256\"}'
|
||||
And Alice unsubscribes from author Alice
|
||||
When Alice sends a channel_metadata event with content '{\"name\": \"Replaced\", \"about\": \"A different test channel.\", \"picture\": \"https://placekitten.com/400/400\"}'
|
||||
And Alice subscribes to channel_creation events
|
||||
And Alice receives a channel_creation event from Alice with content '{\"name\": \"Original\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\"}'
|
||||
And Alice subscribes to channel_metadata events
|
||||
Then Alice receives a channel_metadata event from Alice with content '{\"name\": \"Replaced\", \"about\": \"A different test channel.\", \"picture\": \"https://placekitten.com/400/400\"}'
|
||||
|
@ -33,7 +33,7 @@ When(/^(\w+) sends a channel_metadata event with content '([^']+)'$/, async func
|
||||
Then(/(\w+) receives a channel_creation event from (\w+) with content '([^']+?)'/, async function(name: string, author: string, content: string) {
|
||||
const ws = this.parameters.clients[name] as WebSocket
|
||||
const subscription = this.parameters.subscriptions[name][this.parameters.subscriptions[name].length - 1]
|
||||
const receivedEvent = await waitForNextEvent(ws, subscription.name)
|
||||
const receivedEvent = await waitForNextEvent(ws, subscription.name, content)
|
||||
|
||||
expect(receivedEvent.kind).to.equal(40)
|
||||
expect(receivedEvent.pubkey).to.equal(this.parameters.identities[author].pubkey)
|
||||
@ -44,7 +44,7 @@ Then(/(\w+) receives a channel_creation event from (\w+) with content '([^']+?)'
|
||||
Then(/(\w+) receives a channel_metadata event from (\w+) with content '([^']+?)'/, async function(name: string, author: string, content: string) {
|
||||
const ws = this.parameters.clients[name] as WebSocket
|
||||
const subscription = this.parameters.subscriptions[name][this.parameters.subscriptions[name].length - 1]
|
||||
const receivedEvent = await waitForNextEvent(ws, subscription.name)
|
||||
const receivedEvent = await waitForNextEvent(ws, subscription.name, content)
|
||||
|
||||
const channel = this.parameters.channels[this.parameters.channels.length - 1]
|
||||
|
||||
|
@ -8,16 +8,16 @@ import {
|
||||
When,
|
||||
World,
|
||||
} from '@cucumber/cucumber'
|
||||
import { assocPath, pipe } from 'ramda'
|
||||
import { fromEvent, map, Observable, ReplaySubject, Subject, takeUntil } from 'rxjs'
|
||||
import WebSocket, { MessageEvent } from 'ws'
|
||||
import { assocPath } from 'ramda'
|
||||
|
||||
import { connect, createIdentity, createSubscription, sendEvent } from './helpers'
|
||||
import { AppWorker } from '../../../src/app/worker'
|
||||
//import { CacheClient } from '../../../src/@types/cache'
|
||||
import { CacheClient } from '../../../src/@types/cache'
|
||||
import { DatabaseClient } from '../../../src/@types/base'
|
||||
import { Event } from '../../../src/@types/event'
|
||||
//import { getCacheClient } from '../../../src/cache/client'
|
||||
import { getCacheClient } from '../../../src/cache/client'
|
||||
import { getDbClient } from '../../../src/database/client'
|
||||
import { SettingsStatic } from '../../../src/utils/settings'
|
||||
import { workerFactory } from '../../../src/factories/worker-factory'
|
||||
@ -27,25 +27,32 @@ export const isDraft = Symbol('draft')
|
||||
let worker: AppWorker
|
||||
|
||||
let dbClient: DatabaseClient
|
||||
//let cacheClient: CacheClient
|
||||
let cacheClient: CacheClient
|
||||
|
||||
export const streams = new WeakMap<WebSocket, Observable<unknown>>()
|
||||
|
||||
BeforeAll({ timeout: 1000 }, async function () {
|
||||
process.env.RELAY_PORT = '18808'
|
||||
cacheClient = getCacheClient()
|
||||
dbClient = getDbClient()
|
||||
await dbClient.raw('SELECT 1=1')
|
||||
await cacheClient.connect()
|
||||
await cacheClient.ping()
|
||||
|
||||
const { limits } = SettingsStatic.createSettings()
|
||||
const settings = SettingsStatic.createSettings()
|
||||
|
||||
assocPath(['event', 'createdAt', 'maxPositiveDelta'], 0)(limits)
|
||||
SettingsStatic._settings = pipe(
|
||||
assocPath( ['limits', 'event', 'createdAt', 'maxPositiveDelta'], 0),
|
||||
assocPath( ['limits', 'message', 'rateLimits'], []),
|
||||
assocPath( ['limits', 'event', 'rateLimits'], []),
|
||||
)(settings) as any
|
||||
|
||||
worker = workerFactory()
|
||||
worker.run()
|
||||
})
|
||||
|
||||
AfterAll(async function() {
|
||||
worker.close(async () => dbClient.destroy())
|
||||
worker.close(async () => Promise.all([cacheClient.disconnect(), dbClient.destroy()]))
|
||||
})
|
||||
|
||||
Before(function () {
|
||||
@ -67,9 +74,12 @@ After(async function () {
|
||||
|
||||
const dbClient = getDbClient()
|
||||
|
||||
for (const identity of Object.values(this.parameters.identities as Record<string, { pubkey: string }>)) {
|
||||
await dbClient('events').where({ event_pubkey: Buffer.from(identity.pubkey, 'hex') }).del()
|
||||
}
|
||||
await dbClient('events')
|
||||
.where({
|
||||
event_pubkey: Object
|
||||
.values(this.parameters.identities as Record<string, { pubkey: string }>)
|
||||
.map(({ pubkey }) => Buffer.from(pubkey, 'hex')),
|
||||
}).del()
|
||||
this.parameters.identities = {}
|
||||
})
|
||||
|
||||
|
@ -43,7 +43,7 @@ describe('EventRepository', () => {
|
||||
})
|
||||
|
||||
it('throws error if filters is not an array', () => {
|
||||
expect(() => repository.findByFilters(null)).to.throw(Error, 'Filters cannot be empty')
|
||||
expect(() => repository.findByFilters('' as any)).to.throw(Error, 'Filters cannot be empty')
|
||||
})
|
||||
|
||||
it('throws error if filters is empty', () => {
|
||||
@ -451,7 +451,7 @@ describe('EventRepository', () => {
|
||||
it('insert stubs by pubkey & event ids', () => {
|
||||
const query = repository.insertStubs('001122', ['aabbcc', 'ddeeff']).toString()
|
||||
|
||||
expect(query).to.equal('insert into "events" ("event_content", "event_created_at", "event_deduplication", "event_delegator", "event_id", "event_kind", "event_pubkey", "event_signature", "event_tags") values (\'\', 1673835, \'["001122",5]\', NULL, X\'aabbcc\', 5, X\'001122\', X\'\', \'[]\'), (\'\', 1673835, \'["001122",5]\', NULL, X\'ddeeff\', 5, X\'001122\', X\'\', \'[]\') on conflict do nothing')
|
||||
expect(query).to.equal('insert into "events" ("deleted_at", "event_content", "event_created_at", "event_deduplication", "event_delegator", "event_id", "event_kind", "event_pubkey", "event_signature", "event_tags") values (\'1970-01-20 03:57:15.425\', \'\', 1673835, \'["001122",5]\', NULL, X\'aabbcc\', 5, X\'001122\', X\'\', \'[]\'), (\'1970-01-20 03:57:15.425\', \'\', 1673835, \'["001122",5]\', NULL, X\'ddeeff\', 5, X\'001122\', X\'\', \'[]\') on conflict do nothing')
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -8,7 +8,7 @@ import Sinon from 'sinon'
|
||||
|
||||
export function mockModule<T extends { [K: string]: any }>
|
||||
(
|
||||
moduleToMock: T,
|
||||
moduleToMock: T,
|
||||
defaultMockValuesForMock: Partial<{ [K in keyof T]: T[K] }>
|
||||
) {
|
||||
return (sandbox: Sinon.SinonSandbox, returnOverrides?: Partial<{ [K in keyof T]: T[K] }>): void => {
|
||||
@ -81,24 +81,25 @@ describe('onion',()=>{
|
||||
afterEach(()=>{
|
||||
sandbox.restore()
|
||||
})
|
||||
|
||||
|
||||
it('config emty',()=>{
|
||||
const config = createTorConfig()
|
||||
expect(config).to.include({host: undefined, port: 9051, password: undefined })
|
||||
expect(config).to.include({ port: 9051 })
|
||||
})
|
||||
it('config set',()=>{
|
||||
process.env.TOR_HOST = 'localhost'
|
||||
process.env.TOR_CONTROL_PORT = '9051'
|
||||
process.env.TOR_PASSWORD = 'nostr_ts_relay'
|
||||
process.env.TOR_PASSWORD = 'test'
|
||||
const config = createTorConfig()
|
||||
expect(config).to.include({host: 'localhost', port: 9051,password: 'nostr_ts_relay' })
|
||||
// deepcode ignore NoHardcodedPasswords/test: password is part of the test
|
||||
expect(config).to.include({host: 'localhost', port: 9051,password: 'test' })
|
||||
})
|
||||
it('tor connect fail',async ()=>{
|
||||
//mockTor(sandbox)
|
||||
process.env.TOR_HOST = 'localhost'
|
||||
process.env.TOR_CONTROL_PORT = '9051'
|
||||
process.env.TOR_PASSWORD = 'nostr_ts_relay'
|
||||
|
||||
|
||||
let client:Tor = undefined
|
||||
try{
|
||||
client = await getTorClient()
|
||||
|
Loading…
x
Reference in New Issue
Block a user