Files
aigen/tests/studio2-lora-label.test.mjs

20 lines
1.2 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import {readFileSync} from 'node:fs'
import * as Vue from 'vue'
import {compile} from '@vue/compiler-dom'
import {renderToString} from '@vue/server-renderer'
import {loraFriendlyName,loraIdentityKey} from '../utils/loras.ts'
test('LoRA dropdown renders one clean label or alias, with filename only in tooltip',async()=>{
const source=readFileSync(new URL('../components/LoraSelect.vue',import.meta.url),'utf8')
const option=source.match(/<option\s+v-for="name in availableNames"[\s\S]*?<\/option>/)[0]
const render=new Function('Vue',compile('<select>'+option+'</select>',{mode:'function',prefixIdentifiers:true}).code)(Vue)
const names=['xaigen-minimax csot.safetensors','folder/XAIgen-klein-portrait.safetensors']
const aliases={[loraIdentityKey(names[1])]:'Portrait style'}
const html=await renderToString(Vue.createSSRApp({render,setup:()=>({availableNames:names,filenameSubtitle:true,labelFor:name=>loraFriendlyName(name,aliases)})}))
const options=[...html.matchAll(/<option[^>]*title="([^"]*)"[^>]*>([^<]*)<\/option>/g)]
assert.deepEqual(options.map(match=>match[1]),names)
assert.deepEqual(options.map(match=>match[2]),['xaigen-minimax csot','Portrait style'])
})