UNPKG

firebase-bolt

Version:

Firebase Bolt Security and Modeling Language Compiler

188 lines (186 loc) 19.2 kB
"use strict"; 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=