firebase-bolt
Version:
Firebase Bolt Security and Modeling Language Compiler
188 lines (186 loc) • 19.2 kB
JavaScript
;
exports.__esModule = true;
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var simulator_1 = require("../simulator");
var secrets = require('../../auth-secrets');
simulator_1.rulesSuite("RegExp", function (test) {
test.database(secrets.APP, secrets.SECRET);
test.rules('samples/regexp');
test("SocialSecurity", function (rules) {
rules
.at('/ss')
.write('000-00-0000')
.succeeds("All zeros.")
.write('123-45-6789')
.succeeds("All numbers.")
.write('000-0a-0000')
.fails("Contains letter.")
.write('000-00-00000')
.fails("Too long.")
.write('000-0-000')
.fails("Too short.")
.write('00000000')
.fails("Missing dashes.");
});
test("IntegerString", function (rules) {
rules
.at('/integer')
.write('0')
.succeeds("Zero.")
.write('123')
.succeeds("Example.")
.write('-123')
.succeeds("Negative Example.")
.write('--123')
.fails("Double negative.")
.write('')
.fails("Empty string.")
.write('a')
.fails("Alphabetic.")
.write(' 0')
.fails("Has spaces.")
.write('0.0')
.fails("Has decimal.");
});
test("FloatString", function (rules) {
rules
.at('/float')
.write('0.0')
.succeeds("Zero.")
.write('123.456')
.succeeds("Fixed point number.")
.write('-123.456')
.succeeds("Negative ixed point number.")
.write('.1')
.succeeds("No leading digits.")
.write('1.')
.succeeds("No trailing digits.")
.write('-.1')
.succeeds("Negative fraction only.")
.write('.')
.fails("Just decimal point.")
.write('0')
.succeeds("Zero.")
.write('')
.fails("Empty string.")
.write('a')
.fails("Alphabetic.")
.write(' 0')
.fails("Has spaces.");
});
test("Integer", function (rules) {
rules
.at('/int')
.write(0)
.succeeds("Zero.")
.write(0.0)
.succeeds("Floating Zero.")
.write(123)
.succeeds("Example.")
.write(-123)
.succeeds("Negative example.")
.write(1.1)
.fails("No fractional part allowed.")
.write('0')
.fails("String.");
});
test("Alpha", function (rules) {
rules
.at('/alpha')
.write('a')
.succeeds("Alpha")
.write('A')
.succeeds("Alpha")
.write("hello")
.succeeds("Word.")
.write("123")
.fails("Numeric.")
.write(1)
.fails("Number.")
.write(true)
.fails("Boolean.")
.write("hello, world")
.fails("Non-alpha.");
});
test("Year", function (rules) {
rules
.at('/year')
.write('2015')
.succeeds("This year.")
.write('1900')
.succeeds("Earliest year.")
.write('1999')
.succeeds("Latest in 20th century.")
.write('2099')
.succeeds("Latest in 21th century.")
.write('2015 ')
.fails("Extra space.")
.write('2100')
.fails("Distant future.")
.write(1960)
.fails("Number.")
.write('')
.fails("Empty string.");
});
test("ISODate", function (rules) {
rules
.at('/date')
.write('2015-11-20')
.succeeds("Today.")
.write('1900-01-01')
.succeeds("Earliest date.")
.write('2099-12-31')
.succeeds("Latest date.")
.write('1899-12-31')
.fails("Too early date.")
.write('2100-01-01')
.fails("Too late date.")
.write('')
.fails("Empty string.");
});
test("Slug", function (rules) {
rules
.at('/slug')
.write('this-is-a-slug')
.succeeds("Typical slug text.")
.write('numbers-2016-ok')
.succeeds("Number are ok.")
.write('double--hyphen')
.fails("Double hyphen not ok.")
.write('-leading-hyphen')
.fails("Leading hyphen not ok.")
.write('trailing-hyphen-')
.fails("Trailing hyphen not ok.")
.write('nohyphen')
.fails("Must have at least one hyphen.")
.write('no-Upper')
.fails("No upper case.")
.write('no-special&-char')
.fails("No special characters.")
.write('no spaces')
.fails("No spaces allowed.");
});
test("Domain", function (rules) {
rules
.at('/domain')
.write('google.com')
.succeeds("Simple domain.")
.write('google-com')
.fails("Not a domain.");
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsQ0FBQyIsImZpbGUiOiJ0ZXN0L3JlZ2V4cC10ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge3J1bGVzU3VpdGV9IGZyb20gJy4uL3NpbXVsYXRvcic7XG5sZXQgc2VjcmV0cyA9IHJlcXVpcmUoJy4uLy4uL2F1dGgtc2VjcmV0cycpO1xuXG5ydWxlc1N1aXRlKFwiUmVnRXhwXCIsIGZ1bmN0aW9uKHRlc3QpIHtcbiAgdGVzdC5kYXRhYmFzZShzZWNyZXRzLkFQUCwgc2VjcmV0cy5TRUNSRVQpO1xuICB0ZXN0LnJ1bGVzKCdzYW1wbGVzL3JlZ2V4cCcpO1xuXG4gIHRlc3QoXCJTb2NpYWxTZWN1cml0eVwiLCAocnVsZXMpID0+IHtcbiAgICBydWxlc1xuICAgICAgLmF0KCcvc3MnKVxuICAgICAgLndyaXRlKCcwMDAtMDAtMDAwMCcpXG4gICAgICAuc3VjY2VlZHMoXCJBbGwgemVyb3MuXCIpXG5cbiAgICAgIC53cml0ZSgnMTIzLTQ1LTY3ODknKVxuICAgICAgLnN1Y2NlZWRzKFwiQWxsIG51bWJlcnMuXCIpXG5cbiAgICAgIC53cml0ZSgnMDAwLTBhLTAwMDAnKVxuICAgICAgLmZhaWxzKFwiQ29udGFpbnMgbGV0dGVyLlwiKVxuXG4gICAgICAud3JpdGUoJzAwMC0wMC0wMDAwMCcpXG4gICAgICAuZmFpbHMoXCJUb28gbG9uZy5cIilcblxuICAgICAgLndyaXRlKCcwMDAtMC0wMDAnKVxuICAgICAgLmZhaWxzKFwiVG9vIHNob3J0LlwiKVxuXG4gICAgICAud3JpdGUoJzAwMDAwMDAwJylcbiAgICAgIC5mYWlscyhcIk1pc3NpbmcgZGFzaGVzLlwiKVxuICAgIDtcbiAgfSk7XG5cbiAgdGVzdChcIkludGVnZXJTdHJpbmdcIiwgKHJ1bGVzKSA9PiB7XG4gICAgcnVsZXNcbiAgICAgIC5hdCgnL2ludGVnZXInKVxuICAgICAgLndyaXRlKCcwJylcbiAgICAgIC5zdWNjZWVkcyhcIlplcm8uXCIpXG5cbiAgICAgIC53cml0ZSgnMTIzJylcbiAgICAgIC5zdWNjZWVkcyhcIkV4YW1wbGUuXCIpXG5cbiAgICAgIC53cml0ZSgnLTEyMycpXG4gICAgICAuc3VjY2VlZHMoXCJOZWdhdGl2ZSBFeGFtcGxlLlwiKVxuXG4gICAgICAud3JpdGUoJy0tMTIzJylcbiAgICAgIC5mYWlscyhcIkRvdWJsZSBuZWdhdGl2ZS5cIilcblxuICAgICAgLndyaXRlKCcnKVxuICAgICAgLmZhaWxzKFwiRW1wdHkgc3RyaW5nLlwiKVxuXG4gICAgICAud3JpdGUoJ2EnKVxuICAgICAgLmZhaWxzKFwiQWxwaGFiZXRpYy5cIilcblxuICAgICAgLndyaXRlKCcgMCcpXG4gICAgICAuZmFpbHMoXCJIYXMgc3BhY2VzLlwiKVxuXG4gICAgICAud3JpdGUoJzAuMCcpXG4gICAgICAuZmFpbHMoXCJIYXMgZGVjaW1hbC5cIilcbiAgICA7XG4gIH0pO1xuXG4gIHRlc3QoXCJGbG9hdFN0cmluZ1wiLCAocnVsZXMpID0+IHtcbiAgICBydWxlc1xuICAgICAgLmF0KCcvZmxvYXQnKVxuICAgICAgLndyaXRlKCcwLjAnKVxuICAgICAgLnN1Y2NlZWRzKFwiWmVyby5cIilcblxuICAgICAgLndyaXRlKCcxMjMuNDU2JylcbiAgICAgIC5zdWNjZWVkcyhcIkZpeGVkIHBvaW50IG51bWJlci5cIilcblxuICAgICAgLndyaXRlKCctMTIzLjQ1NicpXG4gICAgICAuc3VjY2VlZHMoXCJOZWdhdGl2ZSBpeGVkIHBvaW50IG51bWJlci5cIilcblxuICAgICAgLndyaXRlKCcuMScpXG4gICAgICAuc3VjY2VlZHMoXCJObyBsZWFkaW5nIGRpZ2l0cy5cIilcblxuICAgICAgLndyaXRlKCcxLicpXG4gICAgICAuc3VjY2VlZHMoXCJObyB0cmFpbGluZyBkaWdpdHMuXCIpXG5cbiAgICAgIC53cml0ZSgnLS4xJylcbiAgICAgIC5zdWNjZWVkcyhcIk5lZ2F0aXZlIGZyYWN0aW9uIG9ubHkuXCIpXG5cbiAgICAgIC53cml0ZSgnLicpXG4gICAgICAuZmFpbHMoXCJKdXN0IGRlY2ltYWwgcG9pbnQuXCIpXG5cbiAgICAgIC53cml0ZSgnMCcpXG4gICAgICAuc3VjY2VlZHMoXCJaZXJvLlwiKVxuXG4gICAgICAud3JpdGUoJycpXG4gICAgICAuZmFpbHMoXCJFbXB0eSBzdHJpbmcuXCIpXG5cbiAgICAgIC53cml0ZSgnYScpXG4gICAgICAuZmFpbHMoXCJBbHBoYWJldGljLlwiKVxuXG4gICAgICAud3JpdGUoJyAwJylcbiAgICAgIC5mYWlscyhcIkhhcyBzcGFjZXMuXCIpXG4gICAgO1xuICB9KTtcblxuICB0ZXN0KFwiSW50ZWdlclwiLCAocnVsZXMpID0+IHtcbiAgICBydWxlc1xuICAgICAgLmF0KCcvaW50JylcbiAgICAgIC53cml0ZSgwKVxuICAgICAgLnN1Y2NlZWRzKFwiWmVyby5cIilcblxuICAgICAgLndyaXRlKDAuMClcbiAgICAgIC5zdWNjZWVkcyhcIkZsb2F0aW5nIFplcm8uXCIpXG5cbiAgICAgIC53cml0ZSgxMjMpXG4gICAgICAuc3VjY2VlZHMoXCJFeGFtcGxlLlwiKVxuXG4gICAgICAud3JpdGUoLTEyMylcbiAgICAgIC5zdWNjZWVkcyhcIk5lZ2F0aXZlIGV4YW1wbGUuXCIpXG5cbiAgICAgIC53cml0ZSgxLjEpXG4gICAgICAuZmFpbHMoXCJObyBmcmFjdGlvbmFsIHBhcnQgYWxsb3dlZC5cIilcblxuICAgICAgLndyaXRlKCcwJylcbiAgICAgIC5mYWlscyhcIlN0cmluZy5cIilcbiAgICA7XG4gIH0pO1xuXG4gIHRlc3QoXCJBbHBoYVwiLCAocnVsZXMpID0+IHtcbiAgICBydWxlc1xuICAgICAgLmF0KCcvYWxwaGEnKVxuICAgICAgLndyaXRlKCdhJylcbiAgICAgIC5zdWNjZWVkcyhcIkFscGhhXCIpXG5cbiAgICAgIC53cml0ZSgnQScpXG4gICAgICAuc3VjY2VlZHMoXCJBbHBoYVwiKVxuXG4gICAgICAud3JpdGUoXCJoZWxsb1wiKVxuICAgICAgLnN1Y2NlZWRzKFwiV29yZC5cIilcblxuICAgICAgLndyaXRlKFwiMTIzXCIpXG4gICAgICAuZmFpbHMoXCJOdW1lcmljLlwiKVxuXG4gICAgICAud3JpdGUoMSlcbiAgICAgIC5mYWlscyhcIk51bWJlci5cIilcblxuICAgICAgLndyaXRlKHRydWUpXG4gICAgICAuZmFpbHMoXCJCb29sZWFuLlwiKVxuXG4gICAgICAud3JpdGUoXCJoZWxsbywgd29ybGRcIilcbiAgICAgIC5mYWlscyhcIk5vbi1hbHBoYS5cIilcbiAgICA7XG4gIH0pO1xuXG4gIHRlc3QoXCJZZWFyXCIsIChydWxlcykgPT4ge1xuICAgIHJ1bGVzXG4gICAgICAuYXQoJy95ZWFyJylcbiAgICAgIC53cml0ZSgnMjAxNScpXG4gICAgICAuc3VjY2VlZHMoXCJUaGlzIHllYXIuXCIpXG5cbiAgICAgIC53cml0ZSgnMTkwMCcpXG4gICAgICAuc3VjY2VlZHMoXCJFYXJsaWVzdCB5ZWFyLlwiKVxuXG4gICAgICAud3JpdGUoJzE5OTknKVxuICAgICAgLnN1Y2NlZWRzKFwiTGF0ZXN0IGluIDIwdGggY2VudHVyeS5cIilcblxuICAgICAgLndyaXRlKCcyMDk5JylcbiAgICAgIC5zdWNjZWVkcyhcIkxhdGVzdCBpbiAyMXRoIGNlbnR1cnkuXCIpXG5cbiAgICAgIC53cml0ZSgnMjAxNSAnKVxuICAgICAgLmZhaWxzKFwiRXh0cmEgc3BhY2UuXCIpXG5cbiAgICAgIC53cml0ZSgnMjEwMCcpXG4gICAgICAuZmFpbHMoXCJEaXN0YW50IGZ1dHVyZS5cIilcblxuICAgICAgLndyaXRlKDE5NjApXG4gICAgICAuZmFpbHMoXCJOdW1iZXIuXCIpXG5cbiAgICAgIC53cml0ZSgnJylcbiAgICAgIC5mYWlscyhcIkVtcHR5IHN0cmluZy5cIilcbiAgICA7XG4gIH0pO1xuXG4gIHRlc3QoXCJJU09EYXRlXCIsIChydWxlcykgPT4ge1xuICAgIHJ1bGVzXG4gICAgICAuYXQoJy9kYXRlJylcbiAgICAgIC53cml0ZSgnMjAxNS0xMS0yMCcpXG4gICAgICAuc3VjY2VlZHMoXCJUb2RheS5cIilcblxuICAgICAgLndyaXRlKCcxOTAwLTAxLTAxJylcbiAgICAgIC5zdWNjZWVkcyhcIkVhcmxpZXN0IGRhdGUuXCIpXG5cbiAgICAgIC53cml0ZSgnMjA5OS0xMi0zMScpXG4gICAgICAuc3VjY2VlZHMoXCJMYXRlc3QgZGF0ZS5cIilcblxuICAgICAgLndyaXRlKCcxODk5LTEyLTMxJylcbiAgICAgIC5mYWlscyhcIlRvbyBlYXJseSBkYXRlLlwiKVxuXG4gICAgICAud3JpdGUoJzIxMDAtMDEtMDEnKVxuICAgICAgLmZhaWxzKFwiVG9vIGxhdGUgZGF0ZS5cIilcblxuICAgICAgLndyaXRlKCcnKVxuICAgICAgLmZhaWxzKFwiRW1wdHkgc3RyaW5nLlwiKVxuICAgIDtcbiAgfSk7XG5cbiAgdGVzdChcIlNsdWdcIiwgKHJ1bGVzKSA9PiB7XG4gICAgcnVsZXNcbiAgICAgIC5hdCgnL3NsdWcnKVxuICAgICAgLndyaXRlKCd0aGlzLWlzLWEtc2x1ZycpXG4gICAgICAuc3VjY2VlZHMoXCJUeXBpY2FsIHNsdWcgdGV4dC5cIilcblxuICAgICAgLndyaXRlKCdudW1iZXJzLTIwMTYtb2snKVxuICAgICAgLnN1Y2NlZWRzKFwiTnVtYmVyIGFyZSBvay5cIilcblxuICAgICAgLndyaXRlKCdkb3VibGUtLWh5cGhlbicpXG4gICAgICAuZmFpbHMoXCJEb3VibGUgaHlwaGVuIG5vdCBvay5cIilcblxuICAgICAgLndyaXRlKCctbGVhZGluZy1oeXBoZW4nKVxuICAgICAgLmZhaWxzKFwiTGVhZGluZyBoeXBoZW4gbm90IG9rLlwiKVxuXG4gICAgICAud3JpdGUoJ3RyYWlsaW5nLWh5cGhlbi0nKVxuICAgICAgLmZhaWxzKFwiVHJhaWxpbmcgaHlwaGVuIG5vdCBvay5cIilcblxuICAgICAgLndyaXRlKCdub2h5cGhlbicpXG4gICAgICAuZmFpbHMoXCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGh5cGhlbi5cIilcblxuICAgICAgLndyaXRlKCduby1VcHBlcicpXG4gICAgICAuZmFpbHMoXCJObyB1cHBlciBjYXNlLlwiKVxuXG4gICAgICAud3JpdGUoJ25vLXNwZWNpYWwmLWNoYXInKVxuICAgICAgLmZhaWxzKFwiTm8gc3BlY2lhbCBjaGFyYWN0ZXJzLlwiKVxuXG4gICAgICAud3JpdGUoJ25vIHNwYWNlcycpXG4gICAgICAuZmFpbHMoXCJObyBzcGFjZXMgYWxsb3dlZC5cIilcbiAgICA7XG4gIH0pO1xuXG4gIHRlc3QoXCJEb21haW5cIiwgKHJ1bGVzKSA9PiB7XG4gICAgcnVsZXNcbiAgICAgIC5hdCgnL2RvbWFpbicpXG4gICAgICAud3JpdGUoJ2dvb2dsZS5jb20nKVxuICAgICAgLnN1Y2NlZWRzKFwiU2ltcGxlIGRvbWFpbi5cIilcblxuICAgICAgLndyaXRlKCdnb29nbGUtY29tJylcbiAgICAgIC5mYWlscyhcIk5vdCBhIGRvbWFpbi5cIilcbiAgICA7XG4gIH0pO1xufSk7XG4iXX0=