import groovy.io.FileType
import groovy.json.JsonSlurper
def tests = new File('tests')
def specs = new File(tests, 'spec_testcases')
specs.eachFileRecurse(FileType.DIRECTORIES) { dir ->
def path = dir.toPath()
def testFile = new File(dir, 'mod.rs')
def requestResponsePath = path.getNameCount() > 3 ? path.getName(3).toString() : ''
def specVersion = path.getName(2).toString().toUpperCase()
testFile.withPrintWriter { pw ->
pw.println('#[allow(unused_imports)]')
pw.println('use pact_matching::models::*;')
pw.println('#[allow(unused_imports)]')
pw.println('use env_logger;')
if (requestResponsePath == 'request') {
pw.println('#[allow(unused_imports)]')
pw.println('use pact_matching::match_request;')
pw.println('#[allow(unused_imports)]')
pw.println('use expectest::prelude::*;')
pw.println('#[allow(unused_imports)]')
pw.println('use serde_json;')
} else if (requestResponsePath == 'response') {
pw.println('#[allow(unused_imports)]')
pw.println('use pact_matching::match_response;')
pw.println('#[allow(unused_imports)]')
pw.println('use expectest::prelude::*;')
pw.println('#[allow(unused_imports)]')
pw.println('use serde_json;')
}
dir.eachDir {
pw.println "mod $it.name;"
}
dir.eachFileMatch(~/.*\.json/) {
def json = new JsonSlurper().parse(it)
def testBody = """
|#[test]
|fn ${it.name.replaceAll(' ', '_').replaceAll('-', '_').replaceAll('\\.json', '')}() {
| env_logger::init().unwrap_or(());
| let pact : serde_json::Value = serde_json::from_str(r#"
"""
it.text.eachLine { line ->
testBody += '| ' + line + '\n'
}
testBody += '| "#).unwrap();' + '\n'
if (requestResponsePath == 'request') {
testBody += """
| let expected = Request::from_json(&pact.get("expected").unwrap(), &PactSpecification::$specVersion);
| println!("{:?}", expected);
| let actual = Request::from_json(&pact.get("actual").unwrap(), &PactSpecification::$specVersion);
| println!("{:?}", actual);
| let pact_match = pact.get("match").unwrap();
| if pact_match.as_bool().unwrap() {
| expect!(match_request(expected, actual)).to(be_empty());
| } else {
| expect!(match_request(expected, actual)).to_not(be_empty());
| }
"""
} else if (requestResponsePath == 'response') {
testBody += """
| let expected = Response::from_json(&pact.get("expected").unwrap(), &PactSpecification::$specVersion);
| println!("{:?}", expected);
| let actual = Response::from_json(&pact.get("actual").unwrap(), &PactSpecification::$specVersion);
| println!("{:?}", actual);
| let pact_match = pact.get("match").unwrap();
| let result = match_response(expected, actual);
| if pact_match.as_bool().unwrap() {
| expect!(result).to(be_empty());
| } else {
| expect!(result).to_not(be_empty());
| }
"""
}
testBody += '|}'
pw.println testBody.stripMargin('|')
}
}
}