Skip to content

Commit

Permalink
Merge pull request #42101 from Thevakumar-Luheerathan/fix-ballerina-l…
Browse files Browse the repository at this point in the history
…ang-iss-42034-8.x

[2201.8.x] Fix bad sad error when a function from a transitive dependency is mocked
  • Loading branch information
Thevakumar-Luheerathan authored Feb 6, 2024
2 parents 2dd28d8 + 6822b9d commit 28796a1
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -115,35 +115,13 @@ public void generateMockFunctions(BLangPackage pkgNode) {
// Get the Mock Function map from the pkgNode
Map<String, String> mockFunctionMap = pkgNode.getTestablePkg().getMockFunctionNamesMap();

// Get all the imports symbols from the testable package
Set<String> mockFunctionSet = mockFunctionMap.keySet();
ArrayList<String> importsList = new ArrayList<>();
for (BLangImportPackage importPkg : pkgNode.getTestablePkg().getImports()) {
if (importPkg.symbol == null) {
continue;
}
if (!importPkg.symbol.toString().contains(testPackageSymbol)) {
importsList.add(importPkg.symbol.toString());
}
}

// Get all the imports from the current package
for (BLangImportPackage importPkg : pkgNode.getImports()) {
if (importPkg.symbol == null) {
continue;
}
if (importsList.contains(importPkg.symbol.toString())) {
continue;
}
if (!importPkg.symbol.toString().contains(testPackageSymbol)) {
importsList.add(importPkg.symbol.toString());
}
}
// Get the mock function type map from the pkgNode
Map<String, Boolean> isLegacyMockingMap = pkgNode.getTestablePkg().getIsLegacyMockingMap();

// Get the set of functions to generate
Set<String> mockFunctionSet = mockFunctionMap.keySet();
for (String function : mockFunctionSet) {
if (function.contains(pkgNode.packageID.toString()) ? !function.split(pkgNode.packageID.toString())[1].
startsWith(MOCK_LEGACY_DELIMITER) :
!startsWithMockLegacyDelimiterForImportedMockFunctions(function, importsList)) {
if (!isLegacyMockingMap.get(function)) {
pkgNode.getTestablePkg().functions.add(generateMockFunction(function));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public class BLangTestablePackage extends BLangPackage {
// Semantic Data
//Map to maintain all the mock functions
private Map<String, String> mockFunctionNamesMap = new HashMap<>();

private final Map<String, Boolean> isLegacyMockingMap = new HashMap<>();
public Map<String, String> getMockFunctionNamesMap() {
return mockFunctionNamesMap;
}
Expand All @@ -46,4 +48,12 @@ public <T> void accept(BLangNodeAnalyzer<T> analyzer, T props) {
public <T, R> R apply(BLangNodeTransformer<T, R> modifier, T props) {
return modifier.transform(this, props);
}

public Map<String, Boolean> getIsLegacyMockingMap() {
return isLegacyMockingMap;
}

public void addIsLegacyMockingMap(String id, Boolean isLegacy) {
this.isLegacyMockingMap.put(id, isLegacy);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ public void process(SimpleVariableNode simpleVariableNode, List<AnnotationAttach
bLangTestablePackage.addMockFunction(
functionToMockID + MOCK_FN_DELIMITER + annotationValues[1],
mockFnObjectName);
bLangTestablePackage.addIsLegacyMockingMap(
functionToMockID + MOCK_FN_DELIMITER + annotationValues[1], false);

if (functionToMockID != null) {
// Adding `<className> # <functionToMock> --> <MockFnObjectName>` to registry
Expand Down Expand Up @@ -257,6 +259,8 @@ public void process(FunctionNode functionNode, List<AnnotationAttachmentNode> an
(BLangTestablePackage) ((BLangFunction) functionNode).parent; // parent -> BLangPackage
bLangTestablePackage.addMockFunction(functionToMockID + MOCK_LEGACY_DELIMITER + vals[1],
functionName);
bLangTestablePackage.addIsLegacyMockingMap(functionToMockID + MOCK_LEGACY_DELIMITER + vals[1],
true);

// Adding `<className> # <functionToMock> --> <MockFnObjectName>` to registry
String className = getQualifiedClassName(bLangTestablePackage,
Expand Down

0 comments on commit 28796a1

Please sign in to comment.