import CodexBarCoreimport Foundationimport Testing struct CopilotDeviceFlowTests { @Test func `prefers verification uri complete when available`() throws { let response = try JSONDecoder().decode( CopilotDeviceFlow.DeviceCodeResponse.self, from: Data( """ { "device_code": "device-code", "user_code": "ABCD-EFGH", "verification_uri": "https://github.com/login/device", "verification_uri_complete": "https://github.com/login/device?user_code=ABCD-EFGH", "expires_in": 900, "interval": 5 } """.utf8)) #expect(response.verificationURLToOpen == "https://github.com/login/device?user_code=ABCD-EFGH") } @Test func `falls back to verification uri when complete url missing`() throws { let response = try JSONDecoder().decode( CopilotDeviceFlow.DeviceCodeResponse.self, from: Data( """ { "device_code": "device-code", "user_code": "ABCD-EFGH", "verification_uri": "https://github.com/login/device", "expires_in": 900, "interval": 5 } """.utf8)) #expect(response.verificationURLToOpen == "https://github.com/login/device") } @Test func `device flow uses github by default`() throws { let flow = CopilotDeviceFlow() let deviceCodeURL = try #require(flow.deviceCodeURL) let accessTokenURL = try #require(flow.accessTokenURL) #expect(deviceCodeURL.absoluteString == "https://github.com/login/device/code") #expect(accessTokenURL.absoluteString == "https://github.com/login/oauth/access_token") } @Test func `device flow uses enterprise host`() throws { let flow = CopilotDeviceFlow(enterpriseHost: "https://octocorp.ghe.com/login") let deviceCodeURL = try #require(flow.deviceCodeURL) let accessTokenURL = try #require(flow.accessTokenURL) #expect(deviceCodeURL.absoluteString == "https://octocorp.ghe.com/login/device/code") #expect(accessTokenURL.absoluteString == "https://octocorp.ghe.com/login/oauth/access_token") } @Test func `device flow rejects invalid enterprise host without crashing`() { let flow = CopilotDeviceFlow(enterpriseHost: "foo bar") #expect(flow.deviceCodeURL == nil) #expect(flow.accessTokenURL == nil) } @Test func `device flow preserves enterprise host port`() throws { let flow = CopilotDeviceFlow(enterpriseHost: "https://octocorp.ghe.com:8443/login") let deviceCodeURL = try #require(flow.deviceCodeURL) let accessTokenURL = try #require(flow.accessTokenURL) #expect(deviceCodeURL.absoluteString == "https://octocorp.ghe.com:8443/login/device/code") #expect(accessTokenURL.absoluteString == "https://octocorp.ghe.com:8443/login/oauth/access_token") } @Test func `usage url uses enterprise api host`() throws { let defaultURL = try #require(CopilotUsageFetcher.usageURL(enterpriseHost: nil)) let enterpriseURL = try #require(CopilotUsageFetcher.usageURL(enterpriseHost: "octocorp.ghe.com")) let enterprisePortURL = try #require(CopilotUsageFetcher.usageURL(enterpriseHost: "octocorp.ghe.com:8443")) #expect(defaultURL.absoluteString == "https://api.github.com/copilot_internal/user") #expect(enterpriseURL.absoluteString == "https://api.octocorp.ghe.com/copilot_internal/user") #expect(enterprisePortURL.absoluteString == "https://api.octocorp.ghe.com:8443/copilot_internal/user") }}
import CodexBarCore
import Foundation
import Testing
struct CopilotDeviceFlowTests {
@Test
func `prefers verification uri complete when available`() throws {
let response = try JSONDecoder().decode(
CopilotDeviceFlow.DeviceCodeResponse.self,
from: Data(
"""
{
"device_code": "device-code",
"user_code": "ABCD-EFGH",
"verification_uri": "https://github.com/login/device",
"verification_uri_complete": "https://github.com/login/device?user_code=ABCD-EFGH",
"expires_in": 900,
"interval": 5
}
""".utf8))
#expect(response.verificationURLToOpen == "https://github.com/login/device?user_code=ABCD-EFGH")
}
@Test
func `falls back to verification uri when complete url missing`() throws {
let response = try JSONDecoder().decode(
CopilotDeviceFlow.DeviceCodeResponse.self,
from: Data(
"""
{
"device_code": "device-code",
"user_code": "ABCD-EFGH",
"verification_uri": "https://github.com/login/device",
"expires_in": 900,
"interval": 5
}
""".utf8))
#expect(response.verificationURLToOpen == "https://github.com/login/device")
}
@Test
func `device flow uses github by default`() throws {
let flow = CopilotDeviceFlow()
let deviceCodeURL = try #require(flow.deviceCodeURL)
let accessTokenURL = try #require(flow.accessTokenURL)
#expect(deviceCodeURL.absoluteString == "https://github.com/login/device/code")
#expect(accessTokenURL.absoluteString == "https://github.com/login/oauth/access_token")
}
@Test
func `device flow uses enterprise host`() throws {
let flow = CopilotDeviceFlow(enterpriseHost: "https://octocorp.ghe.com/login")
let deviceCodeURL = try #require(flow.deviceCodeURL)
let accessTokenURL = try #require(flow.accessTokenURL)
#expect(deviceCodeURL.absoluteString == "https://octocorp.ghe.com/login/device/code")
#expect(accessTokenURL.absoluteString == "https://octocorp.ghe.com/login/oauth/access_token")
}
@Test
func `device flow rejects invalid enterprise host without crashing`() {
let flow = CopilotDeviceFlow(enterpriseHost: "foo bar")
#expect(flow.deviceCodeURL == nil)
#expect(flow.accessTokenURL == nil)
}
@Test
func `device flow preserves enterprise host port`() throws {
let flow = CopilotDeviceFlow(enterpriseHost: "https://octocorp.ghe.com:8443/login")
let deviceCodeURL = try #require(flow.deviceCodeURL)
let accessTokenURL = try #require(flow.accessTokenURL)
#expect(deviceCodeURL.absoluteString == "https://octocorp.ghe.com:8443/login/device/code")
#expect(accessTokenURL.absoluteString == "https://octocorp.ghe.com:8443/login/oauth/access_token")
}
@Test
func `usage url uses enterprise api host`() throws {
let defaultURL = try #require(CopilotUsageFetcher.usageURL(enterpriseHost: nil))
let enterpriseURL = try #require(CopilotUsageFetcher.usageURL(enterpriseHost: "octocorp.ghe.com"))
let enterprisePortURL = try #require(CopilotUsageFetcher.usageURL(enterpriseHost: "octocorp.ghe.com:8443"))
#expect(defaultURL.absoluteString == "https://api.github.com/copilot_internal/user")
#expect(enterpriseURL.absoluteString == "https://api.octocorp.ghe.com/copilot_internal/user")
#expect(enterprisePortURL.absoluteString == "https://api.octocorp.ghe.com:8443/copilot_internal/user")
}
}