@@ -298,50 +298,49 @@ defmodule Livebook.TeamsTest do
298298 end
299299 end
300300
301- describe "deploy_app_from_cli/2 " do
301+ describe "deploy_app_from_cli/4 " do
302302 @ describetag teams_for: :user
303+ @ describetag :tmp_dir
303304
304- @ tag :tmp_dir
305- test "deploys app to Teams using a CLI session" ,
306- % { team: team , node: node , tmp_dir: tmp_dir , org: org } do
307- % { id: id } =
308- TeamsRPC . create_deployment_group ( node ,
309- name: "angry-cat-#{ Ecto.UUID . generate ( ) } " ,
310- url: "http://localhost:4123" ,
311- mode: :online ,
312- org: org
313- )
314-
315- id = to_string ( id )
316- hub_id = "team-#{ org . name } "
317- slug = Utils . random_short_id ( )
318- title = "MyNotebook-#{ slug } "
319- app_settings = % { Notebook.AppSettings . new ( ) | slug: slug }
305+ setup % { team: team , test: test , node: node , org: org , tmp_dir: tmp_dir } do
306+ deployment_group = TeamsRPC . create_deployment_group ( node , mode: :online , org: org )
307+ id = to_string ( deployment_group . id )
308+ assert_receive { :deployment_group_created , % { id: ^ id } }
320309
321310 notebook = % {
322311 Notebook . new ( )
323- | app_settings: app_settings ,
324- name: title ,
325- hub_id: hub_id ,
326- deployment_group_id: id
312+ | app_settings: % { Notebook.AppSettings . new ( ) | slug: Utils . random_short_id ( ) } ,
313+ name: to_string ( test ) ,
314+ hub_id: "team- #{ org . name } " ,
315+ deployment_group_id: to_string ( deployment_group . id )
327316 }
328317
329318 files_dir = FileSystem.File . local ( tmp_dir )
330319
331- # stamp the notebook
332- assert { :ok , app_deployment } = Teams.AppDeployment . new ( notebook , files_dir )
320+ # export to livemd to stamp the notebook (must be done before CLI session)
321+ { source , [ ] } = Livebook.LiveMarkdown . notebook_to_livemd ( notebook )
322+
323+ # create the app deployment from stamped source
324+ assert { :ok , app_deployment } = Teams.AppDeployment . new ( source , files_dir )
333325
334326 # fetch the cli session
335327 { key , _org_token } = TeamsRPC . create_org_token ( node , org: org )
336328 config = % { teams_key: team . teams_key , session_token: key }
337329 assert { :ok , team } = Teams . fetch_cli_session ( config )
338330
339- # deploy the app
340- assert { :ok , _url } = Teams . deploy_app_from_cli ( team , app_deployment , id )
331+ % { app_deployment: app_deployment , team: team , source: source , files_dir: files_dir }
332+ end
333+
334+ test "deploys app to Teams using a CLI session" ,
335+ % { app_deployment: app_deployment , team: team } = ctx do
336+ id = app_deployment . deployment_group_id
337+ assert { :ok , % { "state" => "deployed" } } = Teams . deploy_app_from_cli ( team , app_deployment , id )
341338
339+ slug = app_deployment . slug
340+ title = app_deployment . title
342341 sha = app_deployment . sha
343- multi_session = app_settings . multi_session
344- access_type = app_settings . access_type
342+ multi_session = app_deployment . multi_session
343+ access_type = app_deployment . access_type
345344
346345 assert_receive { :app_deployment_started ,
347346 % Livebook.Teams.AppDeployment {
@@ -352,14 +351,60 @@ defmodule Livebook.TeamsTest do
352351 multi_session: ^ multi_session ,
353352 access_type: ^ access_type ,
354353 deployment_group_id: ^ id
355- } = app_deployment2 }
354+ } = app_deployment_from_ws }
355+
356+ # force app deployment to be stopped
357+ TeamsRPC . toggle_app_deployment ( ctx . node , app_deployment_from_ws . id , team . org_id )
358+ assert_receive { :app_deployment_stopped , ^ app_deployment_from_ws }
359+ end
360+
361+ test "skips if the is still the same version, unless forced to redeploy" ,
362+ % { app_deployment: app_deployment , team: team } = ctx do
363+ id = app_deployment . deployment_group_id
364+ assert { :ok , % { "state" => "deployed" } } = Teams . deploy_app_from_cli ( team , app_deployment , id )
365+
366+ app_deployment_from_ws = assert_app_deployment_started ( app_deployment )
367+
368+ # must skip
369+ { :ok , regenerated_app_deployment } = Teams.AppDeployment . new ( ctx . source , ctx . files_dir )
370+ assert app_deployment . sha == regenerated_app_deployment . sha
371+
372+ assert { :ok , % { "state" => "unchanged" } } =
373+ Teams . deploy_app_from_cli ( team , regenerated_app_deployment , id )
374+
375+ refute_receive { :app_deployment_started , ^ app_deployment_from_ws }
376+
377+ # must redeploy
378+ { :ok , app_deployment } = Teams.AppDeployment . new ( ctx . source , ctx . files_dir )
379+
380+ assert { :ok , % { "state" => "deployed" } } =
381+ Teams . deploy_app_from_cli ( team , app_deployment , id , redeploy: true )
382+
383+ app_deployment_from_ws = assert_app_deployment_started ( app_deployment )
384+
385+ # force app deployment to be stopped
386+ TeamsRPC . toggle_app_deployment ( ctx . node , app_deployment_from_ws . id , team . org_id )
387+ assert_receive { :app_deployment_stopped , ^ app_deployment_from_ws }
388+
389+ # must redeploy because now the app is inactive
390+ { :ok , app_deployment } = Teams.AppDeployment . new ( ctx . source , ctx . files_dir )
391+ assert { :ok , % { "state" => "deployed" } } = Teams . deploy_app_from_cli ( team , app_deployment , id )
392+
393+ assert_app_deployment_started ( app_deployment )
394+ end
395+
396+ test "returns error when has invalid data" , % { app_deployment: app_deployment , team: team } do
397+ id = app_deployment . deployment_group_id
356398
357399 assert Teams . deploy_app_from_cli ( team , app_deployment , 999 ) ==
358400 { :error , % { "deployment_group_id" => [ "does not exist" ] } }
359401
360402 assert Teams . deploy_app_from_cli ( team , % { app_deployment | slug: "@abc" } , id ) ==
361403 { :error , % { "slug" => [ "should only contain alphanumeric characters and dashes" ] } }
362404
405+ assert Teams . deploy_app_from_cli ( team , % { app_deployment | title: nil } , id ) ==
406+ { :error , % { "title" => [ "can't be blank" ] } }
407+
363408 assert Teams . deploy_app_from_cli ( team , % { app_deployment | multi_session: nil } , id ) ==
364409 { :error , % { "multi_session" => [ "can't be blank" ] } }
365410
@@ -368,10 +413,30 @@ defmodule Livebook.TeamsTest do
368413
369414 assert Teams . deploy_app_from_cli ( team , % { app_deployment | access_type: :abc } , id ) ==
370415 { :error , % { "access_type" => [ "is invalid" ] } }
371-
372- # force app deployment to be stopped
373- TeamsRPC . toggle_app_deployment ( node , app_deployment2 . id , team . org_id )
374- assert_receive { :app_deployment_stopped , ^ app_deployment2 }
375416 end
376417 end
418+
419+ defp assert_app_deployment_started ( app_deployment ) do
420+ id = app_deployment . deployment_group_id
421+ slug = app_deployment . slug
422+ title = app_deployment . title
423+ sha = app_deployment . sha
424+ multi_session = app_deployment . multi_session
425+ access_type = app_deployment . access_type
426+
427+ assert_receive { :app_deployment_started ,
428+ % Livebook.Teams.AppDeployment {
429+ slug: ^ slug ,
430+ sha: ^ sha ,
431+ title: ^ title ,
432+ deployed_by: "CLI" ,
433+ multi_session: ^ multi_session ,
434+ access_type: ^ access_type ,
435+ deployment_group_id: ^ id
436+ } = app_deployment_from_ws }
437+
438+ assert_receive { :app_deployment_started , ^ app_deployment_from_ws }
439+
440+ app_deployment_from_ws
441+ end
377442end
0 commit comments