@@ -83,6 +83,105 @@ def test_login_blocked_when_notebooklm_auth_json_set(self, runner, monkeypatch):
8383 assert result .exit_code == 1
8484 assert "Cannot run 'login' when NOTEBOOKLM_AUTH_JSON is set" in result .output
8585
86+ def test_login_help_shows_browser_option (self , runner ):
87+ """Test login --help shows --browser option with chromium/msedge choices."""
88+ result = runner .invoke (cli , ["login" , "--help" ])
89+
90+ assert result .exit_code == 0
91+ assert "--browser" in result .output
92+ assert "chromium" in result .output
93+ assert "msedge" in result .output
94+
95+ def test_login_rejects_invalid_browser (self , runner ):
96+ """Test login rejects invalid --browser values."""
97+ result = runner .invoke (cli , ["login" , "--browser" , "firefox" ])
98+
99+ assert result .exit_code != 0
100+
101+ def test_login_msedge_skips_chromium_install (self , runner , tmp_path ):
102+ """Test --browser msedge skips _ensure_chromium_installed."""
103+ with (
104+ patch ("notebooklm.cli.session._ensure_chromium_installed" ) as mock_ensure ,
105+ patch ("playwright.sync_api.sync_playwright" ) as mock_pw ,
106+ patch (
107+ "notebooklm.cli.session.get_storage_path" , return_value = tmp_path / "storage.json"
108+ ),
109+ patch (
110+ "notebooklm.cli.session.get_browser_profile_dir" ,
111+ return_value = tmp_path / "profile" ,
112+ ),
113+ patch ("notebooklm.cli.session._sync_server_language_to_config" ),
114+ patch ("builtins.input" , return_value = "" ),
115+ ):
116+ mock_context = MagicMock ()
117+ mock_page = MagicMock ()
118+ mock_page .url = "https://notebooklm.google.com/"
119+ mock_context .pages = [mock_page ]
120+ mock_pw .return_value .__enter__ .return_value .chromium .launch_persistent_context .return_value = mock_context
121+
122+ runner .invoke (cli , ["login" , "--browser" , "msedge" ])
123+
124+ mock_ensure .assert_not_called ()
125+
126+ def test_login_msedge_passes_channel_param (self , runner , tmp_path ):
127+ """Test --browser msedge passes channel='msedge' to launch_persistent_context."""
128+ with (
129+ patch ("notebooklm.cli.session._ensure_chromium_installed" ),
130+ patch ("playwright.sync_api.sync_playwright" ) as mock_pw ,
131+ patch (
132+ "notebooklm.cli.session.get_storage_path" , return_value = tmp_path / "storage.json"
133+ ),
134+ patch (
135+ "notebooklm.cli.session.get_browser_profile_dir" ,
136+ return_value = tmp_path / "profile" ,
137+ ),
138+ patch ("notebooklm.cli.session._sync_server_language_to_config" ),
139+ patch ("builtins.input" , return_value = "" ),
140+ ):
141+ mock_context = MagicMock ()
142+ mock_page = MagicMock ()
143+ mock_page .url = "https://notebooklm.google.com/"
144+ mock_context .pages = [mock_page ]
145+ mock_launch = (
146+ mock_pw .return_value .__enter__ .return_value .chromium .launch_persistent_context
147+ )
148+ mock_launch .return_value = mock_context
149+
150+ runner .invoke (cli , ["login" , "--browser" , "msedge" ])
151+
152+ call_kwargs = mock_launch .call_args [1 ]
153+ assert call_kwargs .get ("channel" ) == "msedge"
154+
155+ def test_login_chromium_default_no_channel (self , runner , tmp_path ):
156+ """Test default chromium does not pass channel and calls _ensure_chromium_installed."""
157+ with (
158+ patch ("notebooklm.cli.session._ensure_chromium_installed" ) as mock_ensure ,
159+ patch ("playwright.sync_api.sync_playwright" ) as mock_pw ,
160+ patch (
161+ "notebooklm.cli.session.get_storage_path" , return_value = tmp_path / "storage.json"
162+ ),
163+ patch (
164+ "notebooklm.cli.session.get_browser_profile_dir" ,
165+ return_value = tmp_path / "profile" ,
166+ ),
167+ patch ("notebooklm.cli.session._sync_server_language_to_config" ),
168+ patch ("builtins.input" , return_value = "" ),
169+ ):
170+ mock_context = MagicMock ()
171+ mock_page = MagicMock ()
172+ mock_page .url = "https://notebooklm.google.com/"
173+ mock_context .pages = [mock_page ]
174+ mock_launch = (
175+ mock_pw .return_value .__enter__ .return_value .chromium .launch_persistent_context
176+ )
177+ mock_launch .return_value = mock_context
178+
179+ runner .invoke (cli , ["login" , "--browser" , "chromium" ])
180+
181+ mock_ensure .assert_called_once ()
182+ call_kwargs = mock_launch .call_args [1 ]
183+ assert "channel" not in call_kwargs
184+
86185
87186# =============================================================================
88187# USE COMMAND TESTS
0 commit comments