dart-sass/test/node_api/utils.dart

128 lines
3.6 KiB
Dart
Raw Normal View History

2017-10-21 01:56:54 +02:00
// Copyright 2017 Google Inc. Use of this source code is governed by an
// MIT-style license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
import 'dart:async';
2018-06-15 22:42:36 +02:00
import 'dart:convert';
import 'dart:js_util';
2017-10-21 01:56:54 +02:00
import 'package:js/js.dart';
import 'package:test/test.dart';
import 'package:node_interop/node_interop.dart';
2017-10-21 01:56:54 +02:00
import 'package:sass/src/io.dart';
import 'package:sass/src/node/function.dart';
2021-03-10 02:04:09 +01:00
import 'package:sass/src/util/nullable.dart';
2017-10-21 01:56:54 +02:00
import '../hybrid.dart';
import 'api.dart';
@JS('process.env')
external Object get _environment;
2021-03-10 02:04:09 +01:00
String get sandbox {
var sandbox = _sandbox;
if (sandbox != null) return sandbox;
fail("useSandbox() must be called in any test file that uses the sandbox "
"field.");
}
2021-03-17 03:25:39 +01:00
String? _sandbox;
2017-10-21 01:56:54 +02:00
void useSandbox() {
setUp(() async {
2021-03-10 02:04:09 +01:00
_sandbox = await createTempDir();
2017-10-21 01:56:54 +02:00
});
tearDown(() async {
2021-03-10 02:04:09 +01:00
await _sandbox.andThen(deleteDirectory);
2017-10-21 01:56:54 +02:00
});
}
/// Validates that a [RenderError]'s `toString()` and `message` both equal
/// [text].
2021-03-17 03:25:39 +01:00
Matcher toStringAndMessageEqual(String text) => predicate((dynamic error) {
2017-10-21 01:56:54 +02:00
expect(error.toString(), equals("Error: $text"));
expect(error.message, equals(text));
expect(error.formatted, equals("Error: $text"));
2017-10-21 01:56:54 +02:00
return true;
});
/// Returns the result of rendering via [options] as a string.
Future<String> render(RenderOptions options) {
2018-11-16 00:16:24 +01:00
var completer = Completer<String>();
sass.render(options,
allowInterop(Zone.current.bindBinaryCallbackGuarded((error, result) {
2017-10-21 01:56:54 +02:00
expect(error, isNull);
completer.complete(utf8.decode(result.css));
})));
2017-10-21 01:56:54 +02:00
return completer.future;
}
/// Asserts that rendering via [options] produces an error, and returns that
/// error.
Future<RenderError> renderError(RenderOptions options) {
2018-11-16 00:16:24 +01:00
var completer = Completer<RenderError>();
sass.render(options,
allowInterop(Zone.current.bindBinaryCallbackGuarded((error, result) {
2017-10-21 01:56:54 +02:00
expect(result, isNull);
completer.complete(error);
})));
2017-10-21 01:56:54 +02:00
return completer.future;
}
/// Returns the result of rendering via [options] as a string.
String renderSync(RenderOptions options) =>
utf8.decode(sass.renderSync(options).css);
2017-10-21 01:56:54 +02:00
/// Like [renderSync], but goes through the untyped JS API.
///
/// This lets us test that we properly cast untyped collections without throwing
/// type errors.
String renderSyncJS(Map<String, Object> options) {
var result = _renderSyncJS.call(sass, jsify(options)) as RenderResult;
return utf8.decode(result.css);
}
2018-07-24 01:57:21 +02:00
final _renderSyncJS =
2018-11-16 00:16:24 +01:00
JSFunction("sass", "args", "return sass.renderSync(args);");
2017-10-21 01:56:54 +02:00
/// Asserts that rendering via [options] produces an error, and returns that
/// error.
RenderError renderSyncError(RenderOptions options) {
try {
sass.renderSync(options);
} catch (error) {
return error as RenderError;
}
throw "Expected renderSync() to throw an error.";
}
/// Runs the rest of the test with the working directory in the sandbox
/// directory.
void runTestInSandbox() {
// Make sure the module is loaded before we change the working directory.
sass;
var oldWorkingDirectory = currentPath;
process.chdir(sandbox);
addTearDown(() => process.chdir(oldWorkingDirectory));
}
/// Sets the environment variable [name] to [value] within this process.
2021-03-17 03:25:39 +01:00
void setEnvironmentVariable(String name, String? value) {
setProperty(_environment, name, value);
}
// Runs [callback] with the `SASS_PATH` environment variable set to [paths].
T withSassPath<T>(List<String> paths, T callback()) {
2019-05-31 16:18:35 +02:00
setEnvironmentVariable("SASS_PATH", paths.join(isWindows ? ';' : ':'));
try {
return callback();
} finally {
setEnvironmentVariable("SASS_PATH", null);
}
}