diff --git a/src/common/k8s-api/__tests__/kube-api.test.ts b/src/common/k8s-api/__tests__/kube-api.test.ts index 3cd0768689..510cfe280c 100644 --- a/src/common/k8s-api/__tests__/kube-api.test.ts +++ b/src/common/k8s-api/__tests__/kube-api.test.ts @@ -19,13 +19,39 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { Pod } from "../endpoints/pods.api"; +import { Pod, PodsApi } from "../endpoints/pods.api"; import { forRemoteCluster, KubeApi } from "../kube-api"; import { KubeJsonApi } from "../kube-json-api"; import { KubeObject } from "../kube-object"; describe("forRemoteCluster", () => { - it("builds api client", async (done) => { + it("builds api client for KubeObject", async () => { + const api = forRemoteCluster({ + cluster: { + server: "https://127.0.0.1:6443", + }, + user: { + token: "daa", + }, + }, Pod); + + expect(api).toBeInstanceOf(KubeApi); + }); + + it("builds api client for given KubeApi", async () => { + const api = forRemoteCluster({ + cluster: { + server: "https://127.0.0.1:6443", + }, + user: { + token: "daa", + }, + }, Pod, PodsApi); + + expect(api).toBeInstanceOf(PodsApi); + }); + + it("calls right api endpoint", async () => { const api = forRemoteCluster({ cluster: { server: "https://127.0.0.1:6443", @@ -38,13 +64,13 @@ describe("forRemoteCluster", () => { (fetch as any).mockResponse(async (request: any) => { expect(request.url).toEqual("https://127.0.0.1:6443/api/v1/pods"); - done(); - return { - body: "", + body: "hello", }; }); + expect.hasAssertions(); + await api.list(); }); }); diff --git a/src/common/k8s-api/kube-api.ts b/src/common/k8s-api/kube-api.ts index 79c432c6f9..779656855d 100644 --- a/src/common/k8s-api/kube-api.ts +++ b/src/common/k8s-api/kube-api.ts @@ -115,7 +115,7 @@ export interface IRemoteKubeApiConfig { } } -export function forCluster(cluster: ILocalKubeApiConfig, kubeClass: KubeObjectConstructor): KubeApi { +export function forCluster = KubeApi>(cluster: ILocalKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass: new (apiOpts: IKubeApiOptions) => Y = null): KubeApi { const url = new URL(apiBase.config.serverAddress); const request = new KubeJsonApi({ serverAddress: apiBase.config.serverAddress, @@ -127,15 +127,18 @@ export function forCluster(cluster: ILocalKubeApiConfig, k }, }); - return new KubeApi({ + if (!apiClass) { + apiClass = KubeApi as new (apiOpts: IKubeApiOptions) => Y; + } + + return new apiClass({ objectConstructor: kubeClass, request, }); } -export function forRemoteCluster(config: IRemoteKubeApiConfig, kubeClass: KubeObjectConstructor): KubeApi { +export function forRemoteCluster = KubeApi>(config: IRemoteKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass: new (apiOpts: IKubeApiOptions) => Y = null): Y { const reqInit: RequestInit = {}; - const agentOptions: AgentOptions = {}; if (config.cluster.skipTLSVerify === true) { @@ -172,8 +175,12 @@ export function forRemoteCluster(config: IRemoteKubeApiCon } : {}), }, reqInit); - return new KubeApi({ - objectConstructor: kubeClass, + if (!apiClass) { + apiClass = KubeApi as new (apiOpts: IKubeApiOptions) => Y; + } + + return new apiClass({ + objectConstructor: kubeClass as KubeObjectConstructor, request, }); }