// src/CommonRuntimeSDK.test.ts

// Mock the module before importing
jest.mock("@apic/inventory/src/runtime/RuntimeInventory.js", () => {
  return {
    RuntimeInventory: jest.fn().mockImplementation(() => ({
      getPolicySequenceType: jest.fn().mockReturnValue({ id: 'test-runtime' })
    }))
  };
}, { virtual: true }); // Add virtual: true to create a virtual mock

// Now import the module that uses the mocked dependency
import { RuntimeSDK } from './CommonRuntimeSDK.js';

// Import the mocked constructor to access it in tests
const { RuntimeInventory } = jest.requireMock("@apic/inventory/src/runtime/RuntimeInventory.js");

describe('RuntimeSDK', () => {
  let runtimeSDK: RuntimeSDK;
  
  beforeEach(() => {
    // Clear all mocks before each test
    jest.clearAllMocks();
    
    // Create a new instance of RuntimeSDK for each test
    runtimeSDK = new RuntimeSDK();
  });
  
  describe('initialization', () => {
    it('should create an instance of RuntimeSDK', () => {
      expect(runtimeSDK).toBeInstanceOf(RuntimeSDK);
    });
    
    it('should initialize with a RuntimeInventory instance', () => {
      expect(runtimeSDK.inventory).toBeDefined();
      expect(RuntimeInventory).toHaveBeenCalledTimes(1);
    });
  });
  
  describe('inventory property', () => {
    it('should expose the inventory property', () => {
      expect(runtimeSDK.inventory).toBeDefined();
    });
    
    it('should allow access to inventory methods', () => {
      const mockRuntime = { id: 'test-runtime' };
      
      // Call a method on the inventory
      const runtime = runtimeSDK.inventory.getPolicySequenceType();
      
      // Verify the method was called and returned the expected value
      expect(runtimeSDK.inventory.getPolicySequenceType).toHaveBeenCalled();
      expect(runtime).toEqual(mockRuntime);
    });
    
    it('should allow listing runtimes through inventory', () => {
      const mockRuntimes = {"id": "test-runtime"};
      
      // Call the listRuntimes method
      const runtimes = runtimeSDK.inventory.getPolicySequenceType();
      
      // Verify the method was called and returned the expected value
      expect(runtimeSDK.inventory.getPolicySequenceType).toHaveBeenCalled();
      expect(runtimes).toEqual(mockRuntimes);
    });
  });
  
  describe('interface implementation', () => {
    it('should implement the IRuntimeSDK interface', () => {
      // This is more of a compile-time check, but we can verify
      // that the required properties exist at runtime
      expect(runtimeSDK).toHaveProperty('inventory');
    });
  });
});
