|
1 | 1 | /** |
2 | 2 | * Tests for workflow change detection comparison logic |
3 | 3 | */ |
| 4 | + |
| 5 | +import type { WorkflowVariableFixture } from '@sim/testing' |
4 | 6 | import { |
5 | 7 | createBlock as createTestBlock, |
6 | 8 | createWorkflowState as createTestWorkflowState, |
@@ -47,7 +49,9 @@ function createBlock(id: string, overrides: Record<string, any> = {}): any { |
47 | 49 | }) |
48 | 50 | } |
49 | 51 |
|
50 | | -function createVariablesMap(...variables: Parameters<typeof createWorkflowVariablesMap>[0]): any { |
| 52 | +function createVariablesMap( |
| 53 | + ...variables: Parameters<typeof createWorkflowVariablesMap>[0] |
| 54 | +): Record<string, WorkflowVariableFixture> { |
51 | 55 | return createWorkflowVariablesMap(variables) |
52 | 56 | } |
53 | 57 |
|
@@ -2871,159 +2875,135 @@ describe('hasWorkflowChanged', () => { |
2871 | 2875 | describe('Variables (UI-only fields should not trigger change)', () => { |
2872 | 2876 | it.concurrent('should not detect change when validationError differs', () => { |
2873 | 2877 | const deployedState = createWorkflowState({ |
2874 | | - blocks: { |
2875 | | - block1: createBlock('block1'), |
2876 | | - }, |
2877 | | - }) |
2878 | | - ;(deployedState as any).variables = createVariablesMap({ |
2879 | | - id: 'var1', |
2880 | | - workflowId: 'workflow1', |
2881 | | - name: 'myVar', |
2882 | | - type: 'plain', |
2883 | | - value: 'test', |
| 2878 | + blocks: { block1: createBlock('block1') }, |
| 2879 | + variables: createVariablesMap({ |
| 2880 | + id: 'var1', |
| 2881 | + workflowId: 'workflow1', |
| 2882 | + name: 'myVar', |
| 2883 | + type: 'plain', |
| 2884 | + value: 'test', |
| 2885 | + }), |
2884 | 2886 | }) |
2885 | 2887 |
|
2886 | 2888 | const currentState = createWorkflowState({ |
2887 | | - blocks: { |
2888 | | - block1: createBlock('block1'), |
2889 | | - }, |
2890 | | - }) |
2891 | | - ;(currentState as any).variables = createVariablesMap({ |
2892 | | - id: 'var1', |
2893 | | - workflowId: 'workflow1', |
2894 | | - name: 'myVar', |
2895 | | - type: 'plain', |
2896 | | - value: 'test', |
2897 | | - validationError: undefined, |
| 2889 | + blocks: { block1: createBlock('block1') }, |
| 2890 | + variables: createVariablesMap({ |
| 2891 | + id: 'var1', |
| 2892 | + workflowId: 'workflow1', |
| 2893 | + name: 'myVar', |
| 2894 | + type: 'plain', |
| 2895 | + value: 'test', |
| 2896 | + validationError: undefined, |
| 2897 | + }), |
2898 | 2898 | }) |
2899 | 2899 |
|
2900 | 2900 | expect(hasWorkflowChanged(currentState, deployedState)).toBe(false) |
2901 | 2901 | }) |
2902 | 2902 |
|
2903 | 2903 | it.concurrent('should not detect change when validationError has value vs missing', () => { |
2904 | 2904 | const deployedState = createWorkflowState({ |
2905 | | - blocks: { |
2906 | | - block1: createBlock('block1'), |
2907 | | - }, |
2908 | | - }) |
2909 | | - ;(deployedState as any).variables = createVariablesMap({ |
2910 | | - id: 'var1', |
2911 | | - workflowId: 'workflow1', |
2912 | | - name: 'myVar', |
2913 | | - type: 'number', |
2914 | | - value: 'invalid', |
| 2905 | + blocks: { block1: createBlock('block1') }, |
| 2906 | + variables: createVariablesMap({ |
| 2907 | + id: 'var1', |
| 2908 | + workflowId: 'workflow1', |
| 2909 | + name: 'myVar', |
| 2910 | + type: 'number', |
| 2911 | + value: 'invalid', |
| 2912 | + }), |
2915 | 2913 | }) |
2916 | 2914 |
|
2917 | 2915 | const currentState = createWorkflowState({ |
2918 | | - blocks: { |
2919 | | - block1: createBlock('block1'), |
2920 | | - }, |
2921 | | - }) |
2922 | | - ;(currentState as any).variables = createVariablesMap({ |
2923 | | - id: 'var1', |
2924 | | - workflowId: 'workflow1', |
2925 | | - name: 'myVar', |
2926 | | - type: 'number', |
2927 | | - value: 'invalid', |
2928 | | - validationError: 'Not a valid number', |
| 2916 | + blocks: { block1: createBlock('block1') }, |
| 2917 | + variables: createVariablesMap({ |
| 2918 | + id: 'var1', |
| 2919 | + workflowId: 'workflow1', |
| 2920 | + name: 'myVar', |
| 2921 | + type: 'number', |
| 2922 | + value: 'invalid', |
| 2923 | + validationError: 'Not a valid number', |
| 2924 | + }), |
2929 | 2925 | }) |
2930 | 2926 |
|
2931 | 2927 | expect(hasWorkflowChanged(currentState, deployedState)).toBe(false) |
2932 | 2928 | }) |
2933 | 2929 |
|
2934 | 2930 | it.concurrent('should detect change when variable value differs', () => { |
2935 | 2931 | const deployedState = createWorkflowState({ |
2936 | | - blocks: { |
2937 | | - block1: createBlock('block1'), |
2938 | | - }, |
2939 | | - }) |
2940 | | - ;(deployedState as any).variables = createVariablesMap({ |
2941 | | - id: 'var1', |
2942 | | - workflowId: 'workflow1', |
2943 | | - name: 'myVar', |
2944 | | - type: 'plain', |
2945 | | - value: 'old value', |
| 2932 | + blocks: { block1: createBlock('block1') }, |
| 2933 | + variables: createVariablesMap({ |
| 2934 | + id: 'var1', |
| 2935 | + workflowId: 'workflow1', |
| 2936 | + name: 'myVar', |
| 2937 | + type: 'plain', |
| 2938 | + value: 'old value', |
| 2939 | + }), |
2946 | 2940 | }) |
2947 | 2941 |
|
2948 | 2942 | const currentState = createWorkflowState({ |
2949 | | - blocks: { |
2950 | | - block1: createBlock('block1'), |
2951 | | - }, |
2952 | | - }) |
2953 | | - ;(currentState as any).variables = createVariablesMap({ |
2954 | | - id: 'var1', |
2955 | | - workflowId: 'workflow1', |
2956 | | - name: 'myVar', |
2957 | | - type: 'plain', |
2958 | | - value: 'new value', |
2959 | | - validationError: undefined, |
| 2943 | + blocks: { block1: createBlock('block1') }, |
| 2944 | + variables: createVariablesMap({ |
| 2945 | + id: 'var1', |
| 2946 | + workflowId: 'workflow1', |
| 2947 | + name: 'myVar', |
| 2948 | + type: 'plain', |
| 2949 | + value: 'new value', |
| 2950 | + }), |
2960 | 2951 | }) |
2961 | 2952 |
|
2962 | 2953 | expect(hasWorkflowChanged(currentState, deployedState)).toBe(true) |
2963 | 2954 | }) |
2964 | 2955 |
|
2965 | 2956 | it.concurrent('should detect change when variable is added', () => { |
2966 | 2957 | const deployedState = createWorkflowState({ |
2967 | | - blocks: { |
2968 | | - block1: createBlock('block1'), |
2969 | | - }, |
| 2958 | + blocks: { block1: createBlock('block1') }, |
| 2959 | + variables: {}, |
2970 | 2960 | }) |
2971 | | - ;(deployedState as any).variables = {} |
2972 | 2961 |
|
2973 | 2962 | const currentState = createWorkflowState({ |
2974 | | - blocks: { |
2975 | | - block1: createBlock('block1'), |
2976 | | - }, |
2977 | | - }) |
2978 | | - ;(currentState as any).variables = createVariablesMap({ |
2979 | | - id: 'var1', |
2980 | | - workflowId: 'workflow1', |
2981 | | - name: 'myVar', |
2982 | | - type: 'plain', |
2983 | | - value: 'test', |
| 2963 | + blocks: { block1: createBlock('block1') }, |
| 2964 | + variables: createVariablesMap({ |
| 2965 | + id: 'var1', |
| 2966 | + workflowId: 'workflow1', |
| 2967 | + name: 'myVar', |
| 2968 | + type: 'plain', |
| 2969 | + value: 'test', |
| 2970 | + }), |
2984 | 2971 | }) |
2985 | 2972 |
|
2986 | 2973 | expect(hasWorkflowChanged(currentState, deployedState)).toBe(true) |
2987 | 2974 | }) |
2988 | 2975 |
|
2989 | 2976 | it.concurrent('should detect change when variable is removed', () => { |
2990 | 2977 | const deployedState = createWorkflowState({ |
2991 | | - blocks: { |
2992 | | - block1: createBlock('block1'), |
2993 | | - }, |
2994 | | - }) |
2995 | | - ;(deployedState as any).variables = createVariablesMap({ |
2996 | | - id: 'var1', |
2997 | | - workflowId: 'workflow1', |
2998 | | - name: 'myVar', |
2999 | | - type: 'plain', |
3000 | | - value: 'test', |
| 2978 | + blocks: { block1: createBlock('block1') }, |
| 2979 | + variables: createVariablesMap({ |
| 2980 | + id: 'var1', |
| 2981 | + workflowId: 'workflow1', |
| 2982 | + name: 'myVar', |
| 2983 | + type: 'plain', |
| 2984 | + value: 'test', |
| 2985 | + }), |
3001 | 2986 | }) |
3002 | 2987 |
|
3003 | 2988 | const currentState = createWorkflowState({ |
3004 | | - blocks: { |
3005 | | - block1: createBlock('block1'), |
3006 | | - }, |
| 2989 | + blocks: { block1: createBlock('block1') }, |
| 2990 | + variables: {}, |
3007 | 2991 | }) |
3008 | | - ;(currentState as any).variables = {} |
3009 | 2992 |
|
3010 | 2993 | expect(hasWorkflowChanged(currentState, deployedState)).toBe(true) |
3011 | 2994 | }) |
3012 | 2995 |
|
3013 | 2996 | it.concurrent('should not detect change when empty array vs empty object', () => { |
3014 | 2997 | const deployedState = createWorkflowState({ |
3015 | | - blocks: { |
3016 | | - block1: createBlock('block1'), |
3017 | | - }, |
| 2998 | + blocks: { block1: createBlock('block1') }, |
3018 | 2999 | }) |
3019 | | - ;(deployedState as any).variables = [] |
| 3000 | + // Intentional type violation to test robustness with malformed data |
| 3001 | + ;(deployedState as unknown as Record<string, unknown>).variables = [] |
3020 | 3002 |
|
3021 | 3003 | const currentState = createWorkflowState({ |
3022 | | - blocks: { |
3023 | | - block1: createBlock('block1'), |
3024 | | - }, |
| 3004 | + blocks: { block1: createBlock('block1') }, |
| 3005 | + variables: {}, |
3025 | 3006 | }) |
3026 | | - ;(currentState as any).variables = {} |
3027 | 3007 |
|
3028 | 3008 | expect(hasWorkflowChanged(currentState, deployedState)).toBe(false) |
3029 | 3009 | }) |
|
0 commit comments