@@ -1894,4 +1894,159 @@ describe('useNodePricing', () => {
1894
1894
expect ( getNodeDisplayPrice ( missingDuration ) ) . toBe ( 'Token-based' )
1895
1895
} )
1896
1896
} )
1897
+
1898
+ describe ( 'dynamic pricing - WanTextToVideoApi' , ( ) => {
1899
+ it ( 'should return $1.50 for 10s at 1080p' , ( ) => {
1900
+ const { getNodeDisplayPrice } = useNodePricing ( )
1901
+ const node = createMockNode ( 'WanTextToVideoApi' , [
1902
+ { name : 'duration' , value : '10' } ,
1903
+ { name : 'size' , value : '1080p: 4:3 (1632x1248)' }
1904
+ ] )
1905
+
1906
+ const price = getNodeDisplayPrice ( node )
1907
+ expect ( price ) . toBe ( '$1.50/Run' ) // 0.15 * 10
1908
+ } )
1909
+
1910
+ it ( 'should return $0.50 for 5s at 720p' , ( ) => {
1911
+ const { getNodeDisplayPrice } = useNodePricing ( )
1912
+ const node = createMockNode ( 'WanTextToVideoApi' , [
1913
+ { name : 'duration' , value : 5 } ,
1914
+ { name : 'size' , value : '720p: 16:9 (1280x720)' }
1915
+ ] )
1916
+
1917
+ const price = getNodeDisplayPrice ( node )
1918
+ expect ( price ) . toBe ( '$0.50/Run' ) // 0.10 * 5
1919
+ } )
1920
+
1921
+ it ( 'should return $0.15 for 3s at 480p' , ( ) => {
1922
+ const { getNodeDisplayPrice } = useNodePricing ( )
1923
+ const node = createMockNode ( 'WanTextToVideoApi' , [
1924
+ { name : 'duration' , value : '3' } ,
1925
+ { name : 'size' , value : '480p: 1:1 (624x624)' }
1926
+ ] )
1927
+
1928
+ const price = getNodeDisplayPrice ( node )
1929
+ expect ( price ) . toBe ( '$0.15/Run' ) // 0.05 * 3
1930
+ } )
1931
+
1932
+ it ( 'should fall back when widgets are missing' , ( ) => {
1933
+ const { getNodeDisplayPrice } = useNodePricing ( )
1934
+ const missingBoth = createMockNode ( 'WanTextToVideoApi' , [ ] )
1935
+ const missingSize = createMockNode ( 'WanTextToVideoApi' , [
1936
+ { name : 'duration' , value : '5' }
1937
+ ] )
1938
+ const missingDuration = createMockNode ( 'WanTextToVideoApi' , [
1939
+ { name : 'size' , value : '1080p' }
1940
+ ] )
1941
+
1942
+ expect ( getNodeDisplayPrice ( missingBoth ) ) . toBe ( '$0.05-0.15/second' )
1943
+ expect ( getNodeDisplayPrice ( missingSize ) ) . toBe ( '$0.05-0.15/second' )
1944
+ expect ( getNodeDisplayPrice ( missingDuration ) ) . toBe ( '$0.05-0.15/second' )
1945
+ } )
1946
+
1947
+ it ( 'should fall back on invalid duration' , ( ) => {
1948
+ const { getNodeDisplayPrice } = useNodePricing ( )
1949
+ const node = createMockNode ( 'WanTextToVideoApi' , [
1950
+ { name : 'duration' , value : 'invalid' } ,
1951
+ { name : 'size' , value : '1080p' }
1952
+ ] )
1953
+
1954
+ const price = getNodeDisplayPrice ( node )
1955
+ expect ( price ) . toBe ( '$0.05-0.15/second' )
1956
+ } )
1957
+
1958
+ it ( 'should fall back on unknown resolution' , ( ) => {
1959
+ const { getNodeDisplayPrice } = useNodePricing ( )
1960
+ const node = createMockNode ( 'WanTextToVideoApi' , [
1961
+ { name : 'duration' , value : '10' } ,
1962
+ { name : 'size' , value : '2K' }
1963
+ ] )
1964
+
1965
+ const price = getNodeDisplayPrice ( node )
1966
+ expect ( price ) . toBe ( '$0.05-0.15/second' )
1967
+ } )
1968
+ } )
1969
+
1970
+ describe ( 'dynamic pricing - WanImageToVideoApi' , ( ) => {
1971
+ it ( 'should return $0.80 for 8s at 720p' , ( ) => {
1972
+ const { getNodeDisplayPrice } = useNodePricing ( )
1973
+ const node = createMockNode ( 'WanImageToVideoApi' , [
1974
+ { name : 'duration' , value : 8 } ,
1975
+ { name : 'resolution' , value : '720p' }
1976
+ ] )
1977
+
1978
+ const price = getNodeDisplayPrice ( node )
1979
+ expect ( price ) . toBe ( '$0.80/Run' ) // 0.10 * 8
1980
+ } )
1981
+
1982
+ it ( 'should return $0.60 for 12s at 480P' , ( ) => {
1983
+ const { getNodeDisplayPrice } = useNodePricing ( )
1984
+ const node = createMockNode ( 'WanImageToVideoApi' , [
1985
+ { name : 'duration' , value : '12' } ,
1986
+ { name : 'resolution' , value : '480P' }
1987
+ ] )
1988
+
1989
+ const price = getNodeDisplayPrice ( node )
1990
+ expect ( price ) . toBe ( '$0.60/Run' ) // 0.05 * 12
1991
+ } )
1992
+
1993
+ it ( 'should return $1.50 for 10s at 1080p' , ( ) => {
1994
+ const { getNodeDisplayPrice } = useNodePricing ( )
1995
+ const node = createMockNode ( 'WanImageToVideoApi' , [
1996
+ { name : 'duration' , value : '10' } ,
1997
+ { name : 'resolution' , value : '1080p' }
1998
+ ] )
1999
+
2000
+ const price = getNodeDisplayPrice ( node )
2001
+ expect ( price ) . toBe ( '$1.50/Run' ) // 0.15 * 10
2002
+ } )
2003
+
2004
+ it ( 'should handle "5s" string duration at 1080P' , ( ) => {
2005
+ const { getNodeDisplayPrice } = useNodePricing ( )
2006
+ const node = createMockNode ( 'WanImageToVideoApi' , [
2007
+ { name : 'duration' , value : '5s' } ,
2008
+ { name : 'resolution' , value : '1080P' }
2009
+ ] )
2010
+
2011
+ const price = getNodeDisplayPrice ( node )
2012
+ expect ( price ) . toBe ( '$0.75/Run' ) // 0.15 * 5
2013
+ } )
2014
+
2015
+ it ( 'should fall back when widgets are missing' , ( ) => {
2016
+ const { getNodeDisplayPrice } = useNodePricing ( )
2017
+ const missingBoth = createMockNode ( 'WanImageToVideoApi' , [ ] )
2018
+ const missingRes = createMockNode ( 'WanImageToVideoApi' , [
2019
+ { name : 'duration' , value : '5' }
2020
+ ] )
2021
+ const missingDuration = createMockNode ( 'WanImageToVideoApi' , [
2022
+ { name : 'resolution' , value : '1080p' }
2023
+ ] )
2024
+
2025
+ expect ( getNodeDisplayPrice ( missingBoth ) ) . toBe ( '$0.05-0.15/second' )
2026
+ expect ( getNodeDisplayPrice ( missingRes ) ) . toBe ( '$0.05-0.15/second' )
2027
+ expect ( getNodeDisplayPrice ( missingDuration ) ) . toBe ( '$0.05-0.15/second' )
2028
+ } )
2029
+
2030
+ it ( 'should fall back on invalid duration' , ( ) => {
2031
+ const { getNodeDisplayPrice } = useNodePricing ( )
2032
+ const node = createMockNode ( 'WanImageToVideoApi' , [
2033
+ { name : 'duration' , value : 'invalid' } ,
2034
+ { name : 'resolution' , value : '720p' }
2035
+ ] )
2036
+
2037
+ const price = getNodeDisplayPrice ( node )
2038
+ expect ( price ) . toBe ( '$0.05-0.15/second' )
2039
+ } )
2040
+
2041
+ it ( 'should fall back on unknown resolution' , ( ) => {
2042
+ const { getNodeDisplayPrice } = useNodePricing ( )
2043
+ const node = createMockNode ( 'WanImageToVideoApi' , [
2044
+ { name : 'duration' , value : '10' } ,
2045
+ { name : 'resolution' , value : 'weird-res' }
2046
+ ] )
2047
+
2048
+ const price = getNodeDisplayPrice ( node )
2049
+ expect ( price ) . toBe ( '$0.05-0.15/second' )
2050
+ } )
2051
+ } )
1897
2052
} )
0 commit comments