@@ -893,6 +893,145 @@ defmodule Lightning.WorkflowsTest do
893893 end
894894 end
895895
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+
8961035 defp assert_trigger_state_audit (
8971036 workflow_id ,
8981037 user_id ,
0 commit comments