@@ -893,6 +893,145 @@ defmodule Lightning.WorkflowsTest do
893
893
end
894
894
end
895
895
896
+ describe "get_workflows_for/3" do
897
+ setup do
898
+ project = insert ( :project )
899
+
900
+ % { user: user } =
901
+ insert ( :project_user , project: project , user: build ( :user ) )
902
+
903
+ w1 = insert ( :simple_workflow , project: project , name: "WorkflowSilent" )
904
+ w2 = insert ( :simple_workflow , project: project , name: "WorkflowChatty1" )
905
+ w3 = insert ( :simple_workflow , project: project , name: "WorkflowChatty2" )
906
+
907
+ assert w1 . project . id == project . id
908
+
909
+ Repo . update! ( Ecto.Changeset . change ( hd ( w2 . triggers ) , % { enabled: false } ) )
910
+
911
+ insert ( :chat_session ,
912
+ user: user ,
913
+ job: hd ( w2 . jobs ) ,
914
+ messages: [
915
+ % { role: :user , content: "what?" , user: user }
916
+ ]
917
+ )
918
+
919
+ insert ( :chat_session ,
920
+ user: user ,
921
+ job: hd ( w3 . jobs ) ,
922
+ messages: [
923
+ % { role: :user , content: "what not?" , user: user }
924
+ ]
925
+ )
926
+
927
+ % { project: project , w1: w1 , w2: w2 , w3: w3 , user: user }
928
+ end
929
+
930
+ test "filters workflows by search term" , % { project: project , user: user } do
931
+ workflows =
932
+ Workflows . get_workflows_for ( project , user , search: "chatty" )
933
+ |> Enum . sort_by ( & & 1 . name )
934
+
935
+ assert Enum . map ( workflows , & & 1 . name ) == [
936
+ "WorkflowChatty1" ,
937
+ "WorkflowChatty2"
938
+ ]
939
+
940
+ assert Enum . map ( workflows , & & 1 . has_ai_chat ) == [ true , true ]
941
+ end
942
+
943
+ test "returns empty list for non-matching search" , % {
944
+ project: project ,
945
+ user: user
946
+ } do
947
+ workflows =
948
+ Workflows . get_workflows_for ( project , user , search: "nonexistent" )
949
+
950
+ assert workflows == [ ]
951
+ end
952
+
953
+ test "sorts workflows by name ascending" , % { project: project , user: user } do
954
+ workflows =
955
+ Workflows . get_workflows_for ( project , user , order_by: { :name , :asc } )
956
+
957
+ names = Enum . map ( workflows , & & 1 . name )
958
+ assert names == [ "WorkflowChatty1" , "WorkflowChatty2" , "WorkflowSilent" ]
959
+ end
960
+
961
+ test "sorts workflows by name descending" , % { project: project , user: user } do
962
+ workflows =
963
+ Workflows . get_workflows_for ( project , user , order_by: { :name , :desc } )
964
+
965
+ names = Enum . map ( workflows , & & 1 . name )
966
+ assert names == [ "WorkflowSilent" , "WorkflowChatty2" , "WorkflowChatty1" ]
967
+ end
968
+
969
+ test "sorts workflows by enabled state ascending" , % {
970
+ project: project ,
971
+ user: user
972
+ } do
973
+ workflows =
974
+ Workflows . get_workflows_for ( project , user , order_by: { :enabled , :asc } )
975
+
976
+ first_workflow = List . first ( workflows )
977
+ last_workflow = List . last ( workflows )
978
+
979
+ assert first_workflow . triggers |> Enum . any? ( & & 1 . enabled ) == false
980
+ assert last_workflow . triggers |> Enum . any? ( & & 1 . enabled ) == true
981
+ end
982
+
983
+ test "sorts workflows by enabled state descending" , % {
984
+ project: project ,
985
+ user: user
986
+ } do
987
+ workflows =
988
+ Workflows . get_workflows_for ( project , user , order_by: { :enabled , :desc } )
989
+
990
+ first_workflow = List . first ( workflows )
991
+ last_workflow = List . last ( workflows )
992
+
993
+ assert first_workflow . triggers |> Enum . any? ( & & 1 . enabled ) == true
994
+ assert last_workflow . triggers |> Enum . any? ( & & 1 . enabled ) == false
995
+ end
996
+
997
+ test "uses default sorting for invalid order_by" , % {
998
+ project: project ,
999
+ user: user
1000
+ } do
1001
+ workflows =
1002
+ Workflows . get_workflows_for ( project , user , order_by: { :invalid , :asc } )
1003
+
1004
+ names = Enum . map ( workflows , & & 1 . name )
1005
+ assert names == [ "WorkflowChatty1" , "WorkflowChatty2" , "WorkflowSilent" ]
1006
+ end
1007
+
1008
+ test "customizes preloaded associations" , % { project: project , user: user } do
1009
+ workflows =
1010
+ Workflows . get_workflows_for ( project , user , include: [ :triggers ] )
1011
+
1012
+ workflow = List . first ( workflows )
1013
+
1014
+ assert workflow . triggers != % Ecto.Association.NotLoaded { }
1015
+ assert match? ( % Ecto.Association.NotLoaded { } , workflow . edges )
1016
+ end
1017
+
1018
+ test "always includes triggers even if not specified" , % {
1019
+ project: project ,
1020
+ user: user
1021
+ } do
1022
+ workflows = Workflows . get_workflows_for ( project , user , include: [ :edges ] )
1023
+ workflow = List . first ( workflows )
1024
+
1025
+ assert workflow . triggers != % Ecto.Association.NotLoaded { }
1026
+ assert workflow . edges != % Ecto.Association.NotLoaded { }
1027
+ end
1028
+
1029
+ test "ignores empty search term" , % { project: project , user: user } do
1030
+ workflows = Workflows . get_workflows_for ( project , user , search: "" )
1031
+ assert length ( workflows ) == 3
1032
+ end
1033
+ end
1034
+
896
1035
defp assert_trigger_state_audit (
897
1036
workflow_id ,
898
1037
user_id ,
0 commit comments