• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

AleksandrRogov / DynamicsWebApi / 13912527641

18 Mar 2025 12:20AM UTC coverage: 97.714% (+2.2%) from 95.505%
13912527641

push

github

AleksandrRogov
new search api configuration props; adding tests for the query conversion functionality

601 of 643 branches covered (93.47%)

Branch coverage included in aggregate %.

64 of 67 new or added lines in 6 files covered. (95.52%)

1921 of 1938 relevant lines covered (99.12%)

54.7 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.51
/src/utils/Config.ts
1
import { isRunningWithinPortals, getClientUrl } from "./Utility";
1✔
2
import { ErrorHelper } from "../helpers/ErrorHelper";
1✔
3
import { ApiConfig, Config, SearchApiOptions } from "../dynamics-web-api";
4
import { LIBRARY_NAME } from "../requests/constants";
1✔
5

6
type ApiType = "dataApi" | "searchApi";
7

8
const FUNCTION_NAME = `${LIBRARY_NAME}.setConfig`;
1✔
9

10
export interface InternalApiConfig extends ApiConfig {
11
    url: string;
12
    escapeSpecialCharacters?: boolean;
13
}
14

15
export interface InternalConfig extends Config {
16
    dataApi: InternalApiConfig;
17
    searchApi: InternalApiConfig;
18
}
19

20
const getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {
1✔
21
    if (isRunningWithinPortals()) {
100✔
22
        return new URL("_api", global.window.location.origin).toString() + "/";
2✔
23
    } else {
24
        if (!serverUrl) serverUrl = getClientUrl();
98✔
25
        return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + "/";
98✔
26
    }
27
};
28

29
const mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {
1✔
30
    const internalApiConfig = internalConfig[apiType] as InternalApiConfig;
100✔
31

32
    if (apiConfig?.version) {
100✔
33
        ErrorHelper.stringParameterCheck(apiConfig.version, FUNCTION_NAME, `config.${apiType}.version`);
42✔
34
        internalApiConfig.version = apiConfig.version;
42✔
35
    }
36

37
    if (apiConfig?.path) {
100✔
38
        ErrorHelper.stringParameterCheck(apiConfig.path, FUNCTION_NAME, `config.${apiType}.path`);
4✔
39
        internalApiConfig.path = apiConfig.path;
4✔
40
    }
41

42
    if (apiType === "searchApi") {
100✔
43
        mergeSearchApiOptions(apiConfig?.options, internalApiConfig);
50✔
44
    }
45

46
    internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);
100✔
47
};
48

49
const mergeSearchApiOptions = (options: SearchApiOptions | undefined, internalApiConfig: InternalApiConfig): void => {
1✔
50
    if (!options) return;
50✔
51

NEW
52
    if (internalApiConfig.escapeSpecialCharacters != null) {
×
NEW
53
        ErrorHelper.boolParameterCheck(options.escapeSpecialCharacters, FUNCTION_NAME, `config.searchApi.options.escapeSpecialCharacters`);
×
NEW
54
        internalApiConfig.escapeSpecialCharacters = options.escapeSpecialCharacters;
×
55
    }
56
}
57

58
export class ConfigurationUtility {
1✔
59
    static mergeApiConfigs = mergeApiConfigs;
1✔
60

61
    static merge(internalConfig: InternalConfig, config?: Config): void {
62
        if (config?.serverUrl) {
50✔
63
            ErrorHelper.stringParameterCheck(config.serverUrl, FUNCTION_NAME, "config.serverUrl");
2✔
64
            internalConfig.serverUrl = config.serverUrl;
2✔
65
        }
66

67
        mergeApiConfigs(config?.dataApi, "dataApi", internalConfig);
50✔
68
        mergeApiConfigs(config?.searchApi, "searchApi", internalConfig);
50✔
69

70
        if (config?.impersonate) {
50✔
71
            internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, FUNCTION_NAME, "config.impersonate");
9✔
72
        }
73

74
        if (config?.impersonateAAD) {
50✔
75
            internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, FUNCTION_NAME, "config.impersonateAAD");
2✔
76
        }
77

78
        if (config?.onTokenRefresh) {
50✔
79
            ErrorHelper.callbackParameterCheck(config.onTokenRefresh, FUNCTION_NAME, "config.onTokenRefresh");
6✔
80
            internalConfig.onTokenRefresh = config.onTokenRefresh;
6✔
81
        }
82

83
        if (config?.includeAnnotations) {
50✔
84
            ErrorHelper.stringParameterCheck(config.includeAnnotations, FUNCTION_NAME, "config.includeAnnotations");
2✔
85
            internalConfig.includeAnnotations = config.includeAnnotations;
2✔
86
        }
87

88
        if (config?.timeout) {
50✔
89
            ErrorHelper.numberParameterCheck(config.timeout, FUNCTION_NAME, "config.timeout");
1✔
90
            internalConfig.timeout = config.timeout;
1✔
91
        }
92

93
        if (config?.maxPageSize) {
50✔
94
            ErrorHelper.numberParameterCheck(config.maxPageSize, FUNCTION_NAME, "config.maxPageSize");
2✔
95
            internalConfig.maxPageSize = config.maxPageSize;
2✔
96
        }
97

98
        if (config?.returnRepresentation) {
50✔
99
            ErrorHelper.boolParameterCheck(config.returnRepresentation, FUNCTION_NAME, "config.returnRepresentation");
2✔
100
            internalConfig.returnRepresentation = config.returnRepresentation;
2✔
101
        }
102

103
        if (config?.useEntityNames) {
50✔
104
            ErrorHelper.boolParameterCheck(config.useEntityNames, FUNCTION_NAME, "config.useEntityNames");
1✔
105
            internalConfig.useEntityNames = config.useEntityNames;
1✔
106
        }
107

108
        if (config?.headers) {
50✔
109
            internalConfig.headers = config.headers;
3✔
110
        }
111

112
        if (!global.DWA_BROWSER && config?.proxy) {
50✔
113
            ErrorHelper.parameterCheck(config.proxy, FUNCTION_NAME, "config.proxy");
3✔
114

115
            if (config.proxy.url) {
3✔
116
                ErrorHelper.stringParameterCheck(config.proxy.url, FUNCTION_NAME, "config.proxy.url");
3✔
117

118
                if (config.proxy.auth) {
3✔
119
                    ErrorHelper.parameterCheck(config.proxy.auth, FUNCTION_NAME, "config.proxy.auth");
1✔
120
                    ErrorHelper.stringParameterCheck(config.proxy.auth.username, FUNCTION_NAME, "config.proxy.auth.username");
1✔
121
                    ErrorHelper.stringParameterCheck(config.proxy.auth.password, FUNCTION_NAME, "config.proxy.auth.password");
1✔
122
                }
123
            }
124

125
            internalConfig.proxy = config.proxy;
3✔
126
        }
127
    }
128

129
    static default(): InternalConfig {
130
        return {
40✔
131
            serverUrl: null,
132
            impersonate: null,
133
            impersonateAAD: null,
134
            onTokenRefresh: null,
135
            includeAnnotations: null,
136
            maxPageSize: null,
137
            returnRepresentation: null,
138
            proxy: null,
139
            dataApi: {
140
                path: "data",
141
                version: "9.2",
142
                url: "",
143
            },
144
            searchApi: {
145
                path: "search",
146
                version: "1.0",
147
                url: "",
148
            },
149
        };
150
    }
151
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc