@@ -393,6 +393,86 @@ describe('useNodePricing', () => {
393393 } )
394394 } )
395395
396+ describe ( 'dynamic pricing - Veo3VideoGenerationNode' , ( ) => {
397+ it ( 'should return $2.00 for veo-3.0-fast-generate-001 without audio' , ( ) => {
398+ const { getNodeDisplayPrice } = useNodePricing ( )
399+ const node = createMockNode ( 'Veo3VideoGenerationNode' , [
400+ { name : 'model' , value : 'veo-3.0-fast-generate-001' } ,
401+ { name : 'generate_audio' , value : false }
402+ ] )
403+
404+ const price = getNodeDisplayPrice ( node )
405+ expect ( price ) . toBe ( '$2.00/Run' )
406+ } )
407+
408+ it ( 'should return $3.20 for veo-3.0-fast-generate-001 with audio' , ( ) => {
409+ const { getNodeDisplayPrice } = useNodePricing ( )
410+ const node = createMockNode ( 'Veo3VideoGenerationNode' , [
411+ { name : 'model' , value : 'veo-3.0-fast-generate-001' } ,
412+ { name : 'generate_audio' , value : true }
413+ ] )
414+
415+ const price = getNodeDisplayPrice ( node )
416+ expect ( price ) . toBe ( '$3.20/Run' )
417+ } )
418+
419+ it ( 'should return $4.00 for veo-3.0-generate-001 without audio' , ( ) => {
420+ const { getNodeDisplayPrice } = useNodePricing ( )
421+ const node = createMockNode ( 'Veo3VideoGenerationNode' , [
422+ { name : 'model' , value : 'veo-3.0-generate-001' } ,
423+ { name : 'generate_audio' , value : false }
424+ ] )
425+
426+ const price = getNodeDisplayPrice ( node )
427+ expect ( price ) . toBe ( '$4.00/Run' )
428+ } )
429+
430+ it ( 'should return $6.00 for veo-3.0-generate-001 with audio' , ( ) => {
431+ const { getNodeDisplayPrice } = useNodePricing ( )
432+ const node = createMockNode ( 'Veo3VideoGenerationNode' , [
433+ { name : 'model' , value : 'veo-3.0-generate-001' } ,
434+ { name : 'generate_audio' , value : true }
435+ ] )
436+
437+ const price = getNodeDisplayPrice ( node )
438+ expect ( price ) . toBe ( '$6.00/Run' )
439+ } )
440+
441+ it ( 'should return range when widgets are missing' , ( ) => {
442+ const { getNodeDisplayPrice } = useNodePricing ( )
443+ const node = createMockNode ( 'Veo3VideoGenerationNode' , [ ] )
444+
445+ const price = getNodeDisplayPrice ( node )
446+ expect ( price ) . toBe (
447+ '$2.00-6.00/Run (varies with model & audio generation)'
448+ )
449+ } )
450+
451+ it ( 'should return range when only model widget is present' , ( ) => {
452+ const { getNodeDisplayPrice } = useNodePricing ( )
453+ const node = createMockNode ( 'Veo3VideoGenerationNode' , [
454+ { name : 'model' , value : 'veo-3.0-generate-001' }
455+ ] )
456+
457+ const price = getNodeDisplayPrice ( node )
458+ expect ( price ) . toBe (
459+ '$2.00-6.00/Run (varies with model & audio generation)'
460+ )
461+ } )
462+
463+ it ( 'should return range when only generate_audio widget is present' , ( ) => {
464+ const { getNodeDisplayPrice } = useNodePricing ( )
465+ const node = createMockNode ( 'Veo3VideoGenerationNode' , [
466+ { name : 'generate_audio' , value : true }
467+ ] )
468+
469+ const price = getNodeDisplayPrice ( node )
470+ expect ( price ) . toBe (
471+ '$2.00-6.00/Run (varies with model & audio generation)'
472+ )
473+ } )
474+ } )
475+
396476 describe ( 'dynamic pricing - LumaVideoNode' , ( ) => {
397477 it ( 'should return $2.19 for ray-flash-2 4K 5s' , ( ) => {
398478 const { getNodeDisplayPrice } = useNodePricing ( )
@@ -736,6 +816,13 @@ describe('useNodePricing', () => {
736816 expect ( widgetNames ) . toEqual ( [ 'duration_seconds' ] )
737817 } )
738818
819+ it ( 'should return correct widget names for Veo3VideoGenerationNode' , ( ) => {
820+ const { getRelevantWidgetNames } = useNodePricing ( )
821+
822+ const widgetNames = getRelevantWidgetNames ( 'Veo3VideoGenerationNode' )
823+ expect ( widgetNames ) . toEqual ( [ 'model' , 'generate_audio' ] )
824+ } )
825+
739826 it ( 'should return correct widget names for LumaVideoNode' , ( ) => {
740827 const { getRelevantWidgetNames } = useNodePricing ( )
741828
0 commit comments