using Microsoft.TypeSpec.Generator; using Microsoft.TypeSpec.Generator.ClientModel; using Microsoft.TypeSpec.Generator.ClientModel.Providers; using Microsoft.TypeSpec.Generator.Input; using Microsoft.TypeSpec.Generator.Primitives; using Microsoft.TypeSpec.Generator.Providers; using Microsoft.TypeSpec.Generator.SourceInput; using Moq; using Moq.Protected; using System; using System.Collections.Generic; using System.IO; using System.Reflection; namespace OpenAILibraryPlugin.Tests.TestHelpers { internal class MockHelpers { private static readonly string _configFilePath = Path.Combine(AppContext.BaseDirectory, TestHelpersFolder); private const string TestHelpersFolder = "TestHelpers"; public static Mock LoadMockGenerator( Func>? createSerializationsCore = null, Func? createCSharpTypeCore = null, Func? apiKeyAuth = null, Func? oauth2Auth = null, Func>? apiVersions = null, Func>? inputLiterals = null, Func>? inputEnums = null, Func>? inputModels = null, Func>? clients = null, Func? createClientCore = null, ClientResponseApi? clientResponseApi = null, ClientPipelineApi? clientPipelineApi = null, HttpMessageApi? httpMessageApi = null, string? configurationJson = null, string? inputNamespace = null) { IReadOnlyList inputNsApiVersions = apiVersions?.Invoke() ?? []; IReadOnlyList inputNsLiterals = inputLiterals?.Invoke() ?? []; IReadOnlyList inputNsEnums = inputEnums?.Invoke() ?? []; IReadOnlyList inputNsClients = clients?.Invoke() ?? []; IReadOnlyList inputNsModels = inputModels?.Invoke() ?? []; InputAuth inputNsAuth = new InputAuth(apiKeyAuth?.Invoke(), oauth2Auth?.Invoke()); var mockInputNs = new Mock( inputNamespace ?? "Samples", inputNsApiVersions, inputNsLiterals, inputNsEnums, inputNsModels, inputNsClients, inputNsAuth); var mockInputLibrary = new Mock(_configFilePath); mockInputLibrary.Setup(p => p.InputNamespace).Returns(mockInputNs.Object); Mock? mockTypeFactory = null; if (createCSharpTypeCore is not null) { mockTypeFactory = new Mock() { CallBase = true }; mockTypeFactory.Protected().Setup("CreateCSharpTypeCore", ItExpr.IsAny()).Returns(createCSharpTypeCore); } if (createClientCore is not null) { mockTypeFactory ??= new Mock() { CallBase = true }; mockTypeFactory.Protected().Setup("CreateClientCore", ItExpr.IsAny()).Returns(createClientCore); } // initialize the mock singleton instance of the plugin var codeModelInstance = typeof(CodeModelGenerator).GetField("_instance", BindingFlags.Static | BindingFlags.NonPublic); // invoke the load method with the config file path var loadMethod = typeof(Configuration).GetMethod("Load", BindingFlags.Static | BindingFlags.NonPublic); object?[] parameters = [_configFilePath, configurationJson]; var config = loadMethod?.Invoke(null, parameters); var mockGeneratorContext = new Mock(config!); var mockGeneratorInstance = new Mock(mockGeneratorContext.Object) { CallBase = true }; codeModelInstance!.SetValue(null, mockGeneratorInstance.Object); mockGeneratorInstance.SetupGet(p => p.InputLibrary).Returns(mockInputLibrary.Object); if (mockTypeFactory is not null) { mockGeneratorInstance.SetupGet(p => p.TypeFactory).Returns(mockTypeFactory.Object); } var sourceInputModel = new Mock(() => new SourceInputModel(null, null)) { CallBase = true }; mockGeneratorInstance.Setup(p => p.SourceInputModel).Returns(sourceInputModel.Object); var configureMethod = typeof(CodeModelGenerator).GetMethod( "Configure", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod ); configureMethod!.Invoke(mockGeneratorInstance.Object, null); return mockGeneratorInstance; } public static void SetCustomCodeView(ModelProvider modelProvider, TypeProvider customCodeTypeProvider) { modelProvider.GetType().BaseType!.GetField( "_customCodeView", BindingFlags.NonPublic | BindingFlags.Instance)? .SetValue(modelProvider, new Lazy(() => customCodeTypeProvider)); } } }