├── .gitignore ├── .nvmrc ├── .travis.yml ├── LICENSE ├── README.md ├── bower.json ├── demo └── index.html ├── dist └── angular-viacep.min.js ├── gulpfile.js ├── karma.conf.coffee ├── package.json └── src ├── directives ├── viaCep.directive.coffee ├── viaCep.directive.spec.coffee ├── viaCepForm.directive.coffee └── viaCepForm.directive.spec.coffee ├── helpers ├── viaCep.helper.coffee └── viaCep.helper.spec.coffee ├── services ├── viaCep.service.coffee └── viaCep.service.spec.coffee └── viaCep.module.coffee /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | bower_components/ 3 | tmp/ 4 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v4.4.0 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4.2" 4 | before_script: 5 | - 'npm install -g gulp' 6 | - 'npm install' 7 | - 'npm install -g bower' 8 | - 'bower install' 9 | cache: 10 | directories: 11 | - node_modules 12 | - bower_components 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 cesarbarone 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # angular-viacep [](https://travis-ci.org/cesarbarone/angular-viacep) 2 | 3 | # ViaCEP AngularJS directive and service 4 | 5 | ## See demo [here](https://plnkr.co/edit/2YkyutxNKrm99jRENNwt?p=preview) 6 | 7 | ## How to install: 8 | 9 | ### Install from bower 10 | bower install angular-viacep --save 11 | 12 | ### Include this line in your index.html 13 | 14 | 15 | ### How to use directive(recommended) 16 | #### Just see [demo](https://plnkr.co/edit/2YkyutxNKrm99jRENNwt?p=preview) 17 | 18 | ### Or, if you prefer, use only service 19 | angular.module('app', ['angular.viacep']) 20 | angular.module('app').controller('ctrl', function ctrl($scope, viaCep) { 21 | viaCep.get('08465-312').then(function(response){ 22 | $scope.address = response 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-viacep", 3 | "version": "1.1.2", 4 | "description": "Módulo Angular para integração com a WebService ViaCep", 5 | "main": "dist/angular-viacep.min.js", 6 | "authors": [ 7 | "César Barone (https://github.com/cesarbarone)" 8 | ], 9 | "license": "MIT", 10 | "keywords": [ 11 | "angular", 12 | "via", 13 | "cep", 14 | "ViaCEP" 15 | ], 16 | "homepage": "https://github.com/cesarbarone/angular-viacep", 17 | "moduleType": [], 18 | "ignore": [ 19 | "**/.*", 20 | "node_modules", 21 | "bower_components", 22 | "test", 23 | "tests" 24 | ], 25 | "dependencies": { 26 | "angular": "~1.5.x" 27 | }, 28 | "devDependencies": { 29 | "angular-mocks": "~1.5.x", 30 | "angular-scenario": "~1.5.x" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Angular ViaCEP demo 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 28 | 29 | 30 | 31 | 32 | 33 | Endereço: 34 | CEP 35 | 36 | Cep inválido 37 | 38 | 39 | Logradouro 40 | 41 | 42 | 43 | Bairro 44 | 45 | 46 | 47 | UF 48 | 49 | 50 | 51 | Cidade 52 | 53 | 54 | 55 | Unidade 56 | 57 | 58 | 59 | IBGE 60 | 61 | 62 | 63 | GIA 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | Endereço: 72 | CEP 73 | 74 | Cep inválido 75 | 76 | 77 | Logradouro 78 | 79 | 80 | 81 | Bairro 82 | 83 | 84 | 85 | UF 86 | 87 | 88 | 89 | Cidade 90 | 91 | 92 | 93 | Unidade 94 | 95 | 96 | 97 | IBGE 98 | 99 | 100 | 101 | GIA 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /dist/angular-viacep.min.js: -------------------------------------------------------------------------------- 1 | !function(e,r,n){"use strict";angular.module("angular.viacep",[]),angular.module("angular.viacep").factory("viaCepHelper",["viaCep","$q","VALID_KEYS",function(e,r,n){var t,i,a,u,o,c;return c={},i=function(e,r){var t,i,a,u,o;for(o=[],t=0,a=n.length;t 2 | config.set 3 | # base path, that will be used to resolve files and exclude 4 | # basePath: '' 5 | 6 | # testing framework to use (jasmine/mocha/qunit/...) 7 | frameworks: ['jasmine'] 8 | 9 | reporters: ['mocha'] 10 | 11 | mochaReporter: 12 | output: 'autowatch' 13 | 14 | preprocessors: 15 | '**/*.coffee' : ['coffee'] 16 | 17 | coffeePreprocessor: 18 | options: 19 | bare: true 20 | sourceMap: true 21 | transformPath: (path) -> 22 | path.replace /\.coffee$/, '.js' 23 | 24 | jsonFixturesPreprocessor: 25 | variableName: '__json__' 26 | 27 | # list of files / patterns to load in the browser 28 | files: [ 29 | 'bower_components/angular/angular.js' 30 | 'bower_components/angular-mocks/angular-mocks.js' 31 | 'src/viaCep.module.coffee' 32 | 'src/**/*' 33 | # 'src/address-viacep.coffee' 34 | # 'src/viaCepHelper.coffee' 35 | # 'test/*' 36 | ] 37 | 38 | ngHtml2JsPreprocessor: 39 | stripPrefix: 'src/' 40 | # moduleName: 'template' 41 | 42 | 43 | # list of files / patterns to exclude 44 | exclude: [] 45 | 46 | # web server port 47 | # port: 8080 48 | 49 | # level of logging 50 | # possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG 51 | logLevel: config.LOG_INFO 52 | 53 | # Start these browsers, currently available: 54 | # - Chrome 55 | # - ChromeCanary 56 | # - Opera 57 | # - Safari (only Mac) 58 | # - PhantomJS 59 | # - IE (only Windows) 60 | browsers: [ 61 | 'PhantomJS' 62 | # 'Chrome' 63 | # 'Firefox' 64 | ] 65 | 66 | # Continuous Integration mode 67 | # if true, it capture browsers, run tests and exit 68 | singleRun: false 69 | 70 | # Which plugins to enable 71 | plugins: [ 72 | 'karma-chrome-launcher' 73 | 'karma-phantomjs-launcher' 74 | 'karma-jasmine' 75 | 'karma-mocha-reporter' 76 | 'karma-coffee-preprocessor' 77 | 'karma-coverage' 78 | ] 79 | 80 | # enable / disable watching file and executing tests whenever any file changes 81 | autoWatch: true 82 | 83 | colors: true 84 | 85 | # Uncomment the following lines if you are using grunt's server to run the tests 86 | # proxies: '/base/': 'http://localhost:8080/' 87 | # URL root prevent conflicts with the site root 88 | # urlRoot: '_karma_' 89 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-viacep", 3 | "version": "1.1.2", 4 | "description": "Módulo Angular para integração com a WebService ViaCep", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "gulp test" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/cesarbarone/angular-viacep.git" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/cesarbarone/angular-viacep/issues" 17 | }, 18 | "homepage": "https://github.com/cesarbarone/angular-viacep#readme", 19 | "contributors": [ 20 | "César Barone (https://github.com/cesarbarone)" 21 | ], 22 | "keywords": [ 23 | "angular", 24 | "via cep", 25 | "ViaCEP" 26 | ], 27 | "devDependencies": { 28 | "coffee-script": "^1.10.0", 29 | "del": "^2.2.0", 30 | "gulp": "^3.9.1", 31 | "gulp-coffee": "^2.3.2", 32 | "gulp-concat-util": "^0.5.5", 33 | "gulp-connect": "^5.0.0", 34 | "gulp-debug": "^3.1.0", 35 | "gulp-rename": "^1.2.2", 36 | "gulp-uglify": "^1.5.3", 37 | "gulp-util": "^3.0.7", 38 | "gulp-watch": "^4.3.11", 39 | "jasmine-core": "^2.4.1", 40 | "karma": "^0.13.22", 41 | "karma-chrome-launcher": "^0.2.3", 42 | "karma-coffee-preprocessor": "^0.3.0", 43 | "karma-coverage": "^0.5.5", 44 | "karma-fixture": "^0.2.6", 45 | "karma-jasmine": "^0.3.8", 46 | "karma-json-fixtures-preprocessor": "0.0.6", 47 | "karma-mocha-reporter": "^2.0.0", 48 | "karma-phantomjs-launcher": "^1.0.0", 49 | "phantomjs-prebuilt": "^2.1.7", 50 | "pump": "^1.0.2" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/directives/viaCep.directive.coffee: -------------------------------------------------------------------------------- 1 | angular 2 | .module 'angular.viacep' 3 | .directive 'viaCep', [ 4 | 'viaCepHelper' 5 | (viaCepHelper) -> 6 | restrict: 'A' 7 | require: ['ngModel', '^viaCepForm'] 8 | scope: 9 | viacepKey: '@viaCep' 10 | link: (scope, element, attrs, controllers) -> 11 | ngModelController = controllers[0] 12 | addressController = controllers[1] 13 | 14 | _get = (cepValue) -> 15 | if viaCepHelper.isValidCep(cepValue) 16 | addressController.get(cepValue).then(() -> 17 | ngModelController.$setValidity('cep', true) 18 | ,() -> 19 | ngModelController.$setValidity('cep', false) 20 | ) 21 | else 22 | addressController.cleanAddress() 23 | 24 | 25 | if scope.viacepKey == 'cep' 26 | scope.$watch(() -> 27 | ngModelController.$modelValue 28 | ,(cepValue) -> 29 | _get(cepValue) 30 | ) 31 | else 32 | addressController.registerMapper(scope.viacepKey, ngModelController) 33 | ] -------------------------------------------------------------------------------- /src/directives/viaCep.directive.spec.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | describe 'angular-viacep::viacep', -> 4 | 5 | beforeEach -> 6 | module 'angular.viacep' 7 | 8 | beforeEach inject (_$httpBackend_) -> 9 | @httpBackend = _$httpBackend_ 10 | @httpBackend.whenGET('https://viacep.com.br/ws/88054600/json/').respond({cep: '88054600', logradouro: 'Beira Mar'}) 11 | 12 | beforeEach inject (_$compile_, _$rootScope_) -> 13 | @compile = _$compile_ 14 | @scope = _$rootScope_ 15 | @scope.address = {} 16 | @element = @compile('')(@scope) 17 | @scope.$digest() 18 | 19 | it 'should fill address', -> 20 | ctrl = @element.find('input').controller('ngModel') 21 | ctrl.$setViewValue('88054600') 22 | @httpBackend.flush() 23 | expect(@scope.address.address).toEqual 'Beira Mar' 24 | 25 | it 'should fill address', -> 26 | ctrl = @element.find('input').controller('ngModel') 27 | ctrl.$setViewValue('88054600') 28 | @httpBackend.flush() 29 | expect(@scope.address.address).toEqual 'Beira Mar' 30 | ctrl.$setViewValue('') 31 | @scope.$digest() 32 | expect(@scope.address.address).toEqual '' 33 | -------------------------------------------------------------------------------- /src/directives/viaCepForm.directive.coffee: -------------------------------------------------------------------------------- 1 | angular 2 | .module 'angular.viacep' 3 | .directive 'viaCepForm', [ 4 | () -> 5 | restrict: 'A' 6 | controller: [ 7 | '$scope' 8 | 'viaCepHelper' 9 | 'VALID_KEYS' 10 | ($scope, viaCepHelper, VALID_KEYS) -> 11 | @.mappers = [] 12 | 13 | _get = (cep) -> 14 | viaCepHelper.get(cep, @.mappers) 15 | 16 | _isValidKey = (viacepKey) -> 17 | index = VALID_KEYS.indexOf(viacepKey) 18 | if index == -1 19 | return false 20 | true 21 | 22 | _cleanAddress = -> 23 | viaCepHelper.cleanAddress(@.mappers) 24 | 25 | _registerMapper = (viacepKey, modelController) -> 26 | validKey = _isValidKey(viacepKey) 27 | throw new TypeError "viacep key must be one of: #{VALID_KEYS}" if not validKey 28 | @.mappers[viacepKey] = modelController 29 | 30 | @.registerMapper = _registerMapper 31 | @.get = _get 32 | @.cleanAddress = _cleanAddress 33 | 34 | return @ 35 | ] 36 | 37 | link: (scope, element, attrs) -> 38 | ] 39 | 40 | 41 | angular 42 | .module 'angular.viacep' 43 | .value 'VALID_KEYS', [ 44 | 'cep' 45 | 'logradouro' 46 | 'complemento' 47 | 'bairro' 48 | 'localidade' 49 | 'uf' 50 | 'unidade' 51 | 'ibge' 52 | 'gia' 53 | ] 54 | -------------------------------------------------------------------------------- /src/directives/viaCepForm.directive.spec.coffee: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | describe 'angular-viacep::viacep', -> 4 | 5 | beforeEach -> 6 | module 'angular.viacep' 7 | 8 | beforeEach inject (_$compile_, _$rootScope_) -> 9 | @compile = _$compile_ 10 | @scope = _$rootScope_ 11 | @scope.address = {} 12 | @element = @compile('')(@scope) 13 | @scope.$digest() 14 | 15 | beforeEach inject (_viaCepHelper_) -> 16 | @helper = _viaCepHelper_ 17 | @ctrl = @element.controller('viaCepForm') 18 | 19 | it 'should attach empty mappers', -> 20 | expect(@ctrl.mappers).toEqual [] 21 | 22 | it 'should call viaCepHelper #isValidKey and throw error for invalid key', -> 23 | spyOn(@helper, 'isValidKey') 24 | expect(() => 25 | @ctrl.registerMapper('invalidKey', {}) 26 | ).toThrow(new Error("viacep key must be one of: cep,logradouro,complemento,bairro,localidade,uf,unidade,ibge,gia")); 27 | 28 | it 'should call viaCepHelper #isValidKey', -> 29 | mapper = {mapper: 'm'} 30 | @ctrl.registerMapper('logradouro', mapper) 31 | expect(@ctrl.mappers['logradouro']).toBe(mapper) 32 | 33 | describe "#get", -> 34 | 35 | it 'should call viaCepHelper#get with mappers', -> 36 | cep = '88054611' 37 | spyOn(@helper, 'get') 38 | @ctrl.get(cep) 39 | expect(@helper.get).toHaveBeenCalledWith(cep, @ctrl.mappers) 40 | 41 | describe "#cleanAddress", -> 42 | 43 | it 'should call viaCepHelper#cleanAddress with mappers', -> 44 | spyOn(@helper, 'cleanAddress') 45 | @ctrl.cleanAddress() 46 | expect(@helper.cleanAddress).toHaveBeenCalled() 47 | 48 | -------------------------------------------------------------------------------- /src/helpers/viaCep.helper.coffee: -------------------------------------------------------------------------------- 1 | 2 | angular 3 | .module 'angular.viacep' 4 | .factory 'viaCepHelper', [ 5 | 'viaCep' 6 | '$q' 7 | 'VALID_KEYS' 8 | (viaCep, $q, VALID_KEYS) -> 9 | service = {} 10 | 11 | _fillAddress = (address, mappers) -> 12 | for key in VALID_KEYS 13 | if mappers[key] != undefined 14 | ngModelController = mappers[key] 15 | if !ngModelController.$modelValue 16 | ngModelController.$setViewValue(address[key]) 17 | ngModelController.$render() 18 | 19 | _cleanAddress = (mappers) -> 20 | for key in VALID_KEYS 21 | if mappers[key] != undefined 22 | mappers[key].$setViewValue('') 23 | mappers[key].$render() 24 | 25 | _get = (cepValue, mappers) -> 26 | deferred = $q.defer() 27 | viaCep.get(cepValue) 28 | .then (response) -> 29 | deferred.resolve() 30 | _fillAddress(response, mappers) 31 | , (response) -> 32 | deferred.reject() 33 | _cleanAddress() 34 | deferred.promise 35 | 36 | _isValidKey = (viacepKey) -> 37 | index = VALID_KEYS.indexOf(viacepKey) 38 | if index == -1 39 | return false 40 | true 41 | 42 | _isValidCep = (cepValue) -> 43 | if cepValue is '' 44 | return false 45 | return false if cepValue is null or cepValue is undefined 46 | formatedCep = cepValue.replace(/\D/g, '') 47 | return false if formatedCep.length != 8 48 | true 49 | 50 | service.fillAddress = _fillAddress 51 | service.get = _get 52 | service.isValidCep = _isValidCep 53 | service.isValidKey = _isValidKey 54 | service.cleanAddress = _cleanAddress 55 | 56 | service 57 | ] -------------------------------------------------------------------------------- /src/helpers/viaCep.helper.spec.coffee: -------------------------------------------------------------------------------- 1 | describe 'angular-viacep:viaCepHelper', -> 2 | 3 | beforeEach -> 4 | module 'angular.viacep' 5 | 6 | beforeEach inject (_viaCepHelper_, _viaCep_, _$httpBackend_) -> 7 | @viaCepHelper = _viaCepHelper_ 8 | @viaCep = _viaCep_ 9 | @httpBackend = _$httpBackend_ 10 | 11 | describe '#isValidCep', -> 12 | 13 | it 'should not call #get from cep for empty value', -> 14 | valid = @viaCepHelper.isValidCep('') 15 | expect(valid).toEqual false 16 | 17 | it 'should not call #get from cep for null value', -> 18 | valid = @viaCepHelper.isValidCep(null) 19 | expect(valid).toEqual false 20 | 21 | it 'should not call #get from cep for undefined value', -> 22 | valid = @viaCepHelper.isValidCep(undefined) 23 | expect(valid).toEqual false 24 | 25 | it 'should not call #get from cep for invalid cep', -> 26 | invalidCep = '993' 27 | valid = @viaCepHelper.isValidCep(invalidCep) 28 | expect(valid).toEqual false 29 | 30 | it 'should call #get from cep for valid cep', -> 31 | validCep = '08465312' 32 | valid = @viaCepHelper.isValidCep(validCep) 33 | # expect(valid).toEqual false 34 | 35 | describe '#get', -> 36 | 37 | beforeEach -> 38 | spyOn(@viaCep, 'get').and.callThrough() 39 | 40 | it 'should call #get from cep for valid cep', -> 41 | validCep = '08465312' 42 | @viaCepHelper.get(validCep) 43 | expect(@viaCep.get).toHaveBeenCalledWith(validCep) 44 | 45 | xit 'should call #fillAddress with cep and mappers', -> 46 | spyOn(@viaCepHelper, 'fillAddress') 47 | mappers = [] 48 | validCep = '08465312' 49 | @viaCepHelper.get(validCep, mappers) 50 | expect(@viaCepHelper.fillAddress).toHaveBeenCalledWith(validCep, mappers) 51 | 52 | xdescribe '#get promise', -> 53 | 54 | beforeEach -> 55 | @cep = '99999999' 56 | 57 | it 'should reject', -> 58 | url = "https://viacep.com.br/ws/#{@cep}/json/" 59 | response = 60 | erro: true 61 | @httpBackend.whenGET(url).respond(response) 62 | promise = @viaCepHelper.get(@cep) 63 | spyOn(promise, 'reject') 64 | @httpBackend.flush() 65 | expect(promise.reject).toHaveBeenCalled() 66 | 67 | it 'should resolve', -> 68 | url = "https://viacep.com.br/ws/#{@cep}/json/" 69 | response = 70 | cep: @cep 71 | @httpBackend.whenGET(url).respond(response) 72 | promise = @viaCepHelper.get(@cep) 73 | spyOn(promise, 'resolve') 74 | @httpBackend.flush() 75 | 76 | describe '#fillAddress', -> 77 | 78 | beforeEach -> 79 | @address = 80 | "logradouro": "Praça da Sé" 81 | 82 | it 'should fill address', -> 83 | key = 'logradouro' 84 | ngModelController = 85 | $setViewValue: -> 86 | return null 87 | $render: -> 88 | return null 89 | # for key in keys 90 | mappers = { 91 | 'logradouro': ngModelController 92 | } 93 | 94 | spyOn(ngModelController, '$setViewValue') 95 | spyOn(ngModelController, '$render') 96 | @viaCepHelper.fillAddress(@address, mappers) 97 | expect(ngModelController.$setViewValue).toHaveBeenCalledWith(@address[key]) 98 | expect(ngModelController.$render).toHaveBeenCalled() 99 | 100 | it 'should not override if address already exists', -> 101 | key = 'logradouro' 102 | ngModelController = 103 | $setViewValue: -> 104 | return null 105 | $render: -> 106 | return null 107 | '$modelValue': 'Another logradouro' 108 | # for key in keys 109 | mappers = { 110 | 'logradouro': ngModelController 111 | } 112 | 113 | @viaCepHelper.fillAddress(@address, mappers) 114 | spyOn(ngModelController, '$setViewValue') 115 | spyOn(ngModelController, '$render') 116 | @viaCepHelper.fillAddress(@address, mappers) 117 | expect(ngModelController.$setViewValue).not.toHaveBeenCalled() 118 | expect(ngModelController.$render).not.toHaveBeenCalled() 119 | 120 | describe '#cleanAddress', -> 121 | 122 | it 'should clean address', -> 123 | key = 'logradouro' 124 | ngModelController = 125 | $setViewValue: -> 126 | return null 127 | $render: -> 128 | return null 129 | # for key in keys 130 | mappers = { 131 | 'logradouro': ngModelController 132 | } 133 | 134 | spyOn(ngModelController, '$setViewValue') 135 | spyOn(ngModelController, '$render') 136 | @viaCepHelper.cleanAddress(mappers) 137 | expect(ngModelController.$setViewValue).toHaveBeenCalledWith('') 138 | expect(ngModelController.$render).toHaveBeenCalled() 139 | -------------------------------------------------------------------------------- /src/services/viaCep.service.coffee: -------------------------------------------------------------------------------- 1 | angular 2 | .module('angular.viacep') 3 | .factory 'viaCep', [ 4 | '$http' 5 | '$q' 6 | ($http, $q) -> 7 | _get = (cepValue) -> 8 | throw new TypeError "CEP can't be undefined" if cepValue is undefined 9 | throw new TypeError "CEP can't be empty" if cepValue is '' 10 | throw new TypeError "CEP can't be null" if cepValue is null 11 | formatedCep = cepValue.replace(/\D/g, '') 12 | viaCepUrl = "https://viacep.com.br/ws/#{formatedCep}/json/" 13 | deferred = $q.defer() 14 | $http.get(viaCepUrl) 15 | .then (response) -> 16 | raw = response.data 17 | if raw.erro 18 | deferred.reject('CEP not found') 19 | else 20 | deferred.resolve(raw) 21 | deferred.promise 22 | 23 | get: _get 24 | ] 25 | -------------------------------------------------------------------------------- /src/services/viaCep.service.spec.coffee: -------------------------------------------------------------------------------- 1 | describe 'angular-viacep::cep', -> 2 | 3 | beforeEach -> 4 | module 'angular.viacep' 5 | 6 | beforeEach inject ( _viaCep_, _$http_) -> 7 | @viaCep = _viaCep_ 8 | @http = _$http_ 9 | 10 | describe 'for invalid CEP', -> 11 | 12 | it 'throw error for empty cep', -> 13 | expect(@viaCep.get).toThrowError("CEP can't be undefined") 14 | 15 | it 'throw error for empty cep', -> 16 | f = () => 17 | @viaCep.get('') 18 | expect(f).toThrowError("CEP can't be empty") 19 | 20 | it 'throw error for null cep', -> 21 | f = () => 22 | @viaCep.get(null) 23 | expect(f).toThrowError("CEP can't be null") 24 | 25 | describe 'for valid CEP', -> 26 | 27 | beforeEach -> 28 | spyOn(@http, 'get').and.callThrough() 29 | @formatedCep = '89160000' 30 | @url = "https://viacep.com.br/ws/#{@formatedCep}/json/" 31 | 32 | it 'calls $http get method for non formated cep', -> 33 | @viaCep.get('89160-000') 34 | expect(@http.get).toHaveBeenCalledWith(@url) 35 | 36 | it 'calls $http get method for formated cep', -> 37 | @viaCep.get(@formatedCep) 38 | expect(@http.get).toHaveBeenCalledWith(@url) -------------------------------------------------------------------------------- /src/viaCep.module.coffee: -------------------------------------------------------------------------------- 1 | angular 2 | .module 'angular.viacep', [] --------------------------------------------------------------------------------