OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-wallet / tests / manual / test-device-management.cjs

111 lines · javascript ref:
// test-device-management.cjs - Test device management functions
require('bare-node-runtime/global')

const path = require('bare-path')
const os = require('bare-os')
const fs = require('bare-fs')
const IdentityKey = require('keet-identity-key')
const b4a = require('b4a')
const {
  initializeStorage,
  bootstrapDevice,
  createInvite,
  getCurrentDevice,
  listDevices,
  closeStorage
} = require('./lib/wallet-storage.cjs')

// Test storage directory
const TEST_DIR = path.join(os.homedir(), '.hyper-wallet-test', 'device-mgmt')
const MNEMONIC_FILE = path.join(TEST_DIR, '.mnemonic')

// Clean test directory
if (fs.existsSync(TEST_DIR)) {
  fs.rmSync(TEST_DIR, { recursive: true })
}
fs.mkdirSync(TEST_DIR, { recursive: true, mode: 0o700 })

// Override storage directory for testing
const originalStorageDir = require('./lib/wallet-storage.cjs')

async function runTest() {
  console.log('🧪 Testing Device Management\n')

  // Test 1: Generate identity
  console.log('Test 1: Generate identity')
  const mnemonic = IdentityKey.generateMnemonic()
  const identity = await IdentityKey.from({ mnemonic })
  console.log('✅ Identity generated')
  console.log('   Public key:', b4a.toString(identity.identityKeyPair.publicKey, 'hex').slice(0, 16) + '...')
  console.log('   Mnemonic:', mnemonic.split(' ').slice(0, 3).join(' ') + '...')
  console.log('')

  // Test 2: Initialize storage
  console.log('Test 2: Initialize storage')
  await initializeStorage(identity)
  console.log('✅ Storage initialized')
  console.log('')

  // Test 3: Bootstrap device
  console.log('Test 3: Bootstrap device')
  const device = await bootstrapDevice(identity, 'Test Device A')
  console.log('✅ Device bootstrapped')
  console.log(`   Name:   ${device.name}`)
  console.log(`   Writer: ${b4a.toString(device.key, 'hex').slice(0, 16)}...`)
  console.log(`   Proof:  ${device.proof ? 'Present' : 'None'}`)
  console.log('')

  // Test 4: Get current device
  console.log('Test 4: Get current device')
  const currentDevice = getCurrentDevice()
  if (currentDevice) {
    console.log('✅ Current device found')
    console.log(`   Name: ${currentDevice.name}`)
    console.log(`   Is local: ${currentDevice.isLocal}`)
  } else {
    console.log('❌ Current device not found!')
  }
  console.log('')

  // Test 5: List devices
  console.log('Test 5: List devices')
  const devices = listDevices()
  console.log(`✅ Found ${devices.length} device(s)`)
  for (const d of devices) {
    console.log(`   - ${d.name} (${d.isLocal ? 'local' : 'remote'})`)
  }
  console.log('')

  // Test 6: Create invite
  console.log('Test 6: Create invite')
  const invite = await createInvite(identity)
  console.log('✅ Invite created')
  console.log(`   Length: ${invite.length} characters`)
  console.log(`   Preview: ${invite.slice(0, 40)}...`)
  console.log('')

  // Decode invite to verify
  const inviteJson = b4a.toString(b4a.from(invite, 'base64'))
  const inviteData = JSON.parse(inviteJson)
  console.log('   Invite contains:')
  console.log(`   - discoveryKey: ${inviteData.discoveryKey.slice(0, 16)}...`)
  console.log(`   - identityKey:  ${inviteData.identityKey.slice(0, 16)}...`)
  console.log(`   - autobaseKey:  ${inviteData.autobaseKey.slice(0, 16)}...`)
  console.log(`   - timestamp:    ${new Date(inviteData.timestamp).toLocaleString()}`)
  console.log('')

  // Cleanup
  await closeStorage()

  console.log('✅ All device management tests passed!')
  console.log('')
  console.log('Next: Test multi-device pairing with actual Hyperswarm connections')
}

// Run the test
runTest().catch(err => {
  console.error('❌ Test failed:', err)
  console.error(err.stack)
  process.exit(1)
})