2014-11-25 23:55:50 +03:00
{ $ } = require ' ../src/space-pen-extensions '
2013-09-16 23:15:09 +04:00
path = require ' path '
2014-07-26 02:19:16 +04:00
Package = require ' ../src/package '
2014-02-18 00:59:03 +04:00
ThemePackage = require ' ../src/theme-package '
2013-09-16 23:15:09 +04:00
2014-02-18 00:59:03 +04:00
describe " Package " , ->
2014-07-26 02:19:16 +04:00
describe " when the package contains incompatible native modules " , ->
2014-07-31 19:42:26 +04:00
beforeEach ->
spyOn ( atom , ' inDevMode ' ) . andReturn ( false )
2015-08-22 02:59:28 +03:00
items = { }
spyOn ( global . localStorage , ' setItem ' ) . andCallFake (key, item) -> items [ key ] = item ; undefined
spyOn ( global . localStorage , ' getItem ' ) . andCallFake (key) -> items [ key ] ? null
spyOn ( global . localStorage , ' removeItem ' ) . andCallFake (key) -> delete items [ key ] ; undefined
2014-07-31 19:42:26 +04:00
2014-07-26 02:19:16 +04:00
it " does not activate it " , ->
2015-01-10 01:54:54 +03:00
packagePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/package-with-incompatible-native-module ' )
2014-07-26 02:19:16 +04:00
pack = new Package ( packagePath )
expect ( pack . isCompatible ( ) ) . toBe false
expect ( pack . incompatibleModules [ 0 ] . name ) . toBe ' native-module '
expect ( pack . incompatibleModules [ 0 ] . path ) . toBe path . join ( packagePath , ' node_modules ' , ' native-module ' )
2015-09-17 09:54:44 +03:00
it " utilizes _atomModuleCache to get native modules and skips traversing through submodules " , ->
2015-09-17 19:52:00 +03:00
packagePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/package-with-ignored-incompatible-native-module ' )
2015-09-17 09:54:44 +03:00
pack = new Package ( packagePath )
2015-09-17 19:52:00 +03:00
# Since `_atomModuleCache` exists and it doesn't have the record of the
# incompatible native module, this package is recognized as compatible.
2015-09-17 09:54:44 +03:00
expect ( pack . isCompatible ( ) ) . toBe true
2014-07-26 02:34:03 +04:00
it " caches the incompatible native modules in local storage " , ->
2015-01-10 01:54:54 +03:00
packagePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/package-with-incompatible-native-module ' )
2014-07-26 02:34:03 +04:00
expect ( new Package ( packagePath ) . isCompatible ( ) ) . toBe false
expect ( global . localStorage . getItem . callCount ) . toBe 1
expect ( global . localStorage . setItem . callCount ) . toBe 1
expect ( new Package ( packagePath ) . isCompatible ( ) ) . toBe false
expect ( global . localStorage . getItem . callCount ) . toBe 2
expect ( global . localStorage . setItem . callCount ) . toBe 1
2015-08-22 01:14:22 +03:00
describe " ::rebuild() " , ->
2015-08-22 02:59:28 +03:00
beforeEach ->
spyOn ( atom , ' inDevMode ' ) . andReturn ( false )
items = { }
spyOn ( global . localStorage , ' setItem ' ) . andCallFake (key, item) -> items [ key ] = item ; undefined
spyOn ( global . localStorage , ' getItem ' ) . andCallFake (key) -> items [ key ] ? null
spyOn ( global . localStorage , ' removeItem ' ) . andCallFake (key) -> delete items [ key ] ; undefined
2015-08-22 01:14:22 +03:00
it " returns a promise resolving to the results of `apm rebuild` " , ->
packagePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/package-with-index ' )
pack = new Package ( packagePath )
rebuildCallbacks = [ ]
spyOn ( pack , ' runRebuildProcess ' ) . andCallFake ( (callback) -> rebuildCallbacks . push ( callback ) )
promise = pack . rebuild ( )
rebuildCallbacks [ 0 ] ( { code: 0 , stdout: ' stdout output ' , stderr: ' stderr output ' } )
waitsFor (done) ->
promise . then (result) ->
expect ( result ) . toEqual { code: 0 , stdout: ' stdout output ' , stderr: ' stderr output ' }
done ( )
it " persists build failures in local storage " , ->
packagePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/package-with-index ' )
pack = new Package ( packagePath )
expect ( pack . isCompatible ( ) ) . toBe true
expect ( pack . getBuildFailureOutput ( ) ) . toBeNull ( )
rebuildCallbacks = [ ]
spyOn ( pack , ' runRebuildProcess ' ) . andCallFake ( (callback) -> rebuildCallbacks . push ( callback ) )
pack . rebuild ( )
rebuildCallbacks [ 0 ] ( { code: 13 , stderr: ' It is broken ' } )
expect ( pack . getBuildFailureOutput ( ) ) . toBe ' It is broken '
expect ( pack . getIncompatibleNativeModules ( ) ) . toEqual [ ]
expect ( pack . isCompatible ( ) ) . toBe false
2015-08-22 02:59:28 +03:00
# A different package instance has the same failure output (simulates reload)
2015-08-22 01:14:22 +03:00
pack2 = new Package ( packagePath )
expect ( pack2 . getBuildFailureOutput ( ) ) . toBe ' It is broken '
expect ( pack2 . isCompatible ( ) ) . toBe false
2015-08-22 02:59:28 +03:00
# Clears the build failure after a successful build
pack . rebuild ( )
rebuildCallbacks [ 1 ] ( { code: 0 , stdout: ' It worked ' } )
expect ( pack . getBuildFailureOutput ( ) ) . toBeNull ( )
expect ( pack2 . getBuildFailureOutput ( ) ) . toBeNull ( )
it " sets cached incompatible modules to an empty array when the rebuild completes (there may be a build error, but rebuilding *deletes* native modules) " , ->
packagePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/package-with-incompatible-native-module ' )
pack = new Package ( packagePath )
expect ( pack . getIncompatibleNativeModules ( ) . length ) . toBeGreaterThan ( 0 )
rebuildCallbacks = [ ]
spyOn ( pack , ' runRebuildProcess ' ) . andCallFake ( (callback) -> rebuildCallbacks . push ( callback ) )
pack . rebuild ( )
expect ( pack . getIncompatibleNativeModules ( ) . length ) . toBeGreaterThan ( 0 )
rebuildCallbacks [ 0 ] ( { code: 0 , stdout: ' It worked ' } )
expect ( pack . getIncompatibleNativeModules ( ) . length ) . toBe ( 0 )
2015-08-22 01:14:22 +03:00
2013-09-16 23:15:09 +04:00
describe " theme " , ->
theme = null
beforeEach ->
2014-10-09 01:11:57 +04:00
$ ( " # jasmine-content " ) . append $ ( " <atom-text-editor></atom-text-editor> " )
2013-09-16 23:15:09 +04:00
afterEach ->
theme . deactivate ( ) if theme ?
describe " when the theme contains a single style file " , ->
it " loads and applies css " , ->
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-bottom " ) ) . not . toBe " 1234px "
2015-01-10 01:54:54 +03:00
themePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/theme-with-index-css ' )
2014-02-18 00:59:03 +04:00
theme = new ThemePackage ( themePath )
2013-09-16 23:15:09 +04:00
theme . activate ( )
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-top " ) ) . toBe " 1234px "
2013-09-16 23:15:09 +04:00
it " parses, loads and applies less " , ->
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-bottom " ) ) . not . toBe " 1234px "
2015-01-10 01:54:54 +03:00
themePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/theme-with-index-less ' )
2014-02-18 00:59:03 +04:00
theme = new ThemePackage ( themePath )
2013-09-16 23:15:09 +04:00
theme . activate ( )
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-top " ) ) . toBe " 4321px "
2013-09-16 23:15:09 +04:00
describe " when the theme contains a package.json file " , ->
it " loads and applies stylesheets from package.json in the correct order " , ->
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-top " ) ) . not . toBe ( " 101px " )
expect ( $ ( " atom-text-editor " ) . css ( " padding-right " ) ) . not . toBe ( " 102px " )
expect ( $ ( " atom-text-editor " ) . css ( " padding-bottom " ) ) . not . toBe ( " 103px " )
2013-09-16 23:15:09 +04:00
2015-01-10 01:54:54 +03:00
themePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/theme-with-package-file ' )
2014-02-18 00:59:03 +04:00
theme = new ThemePackage ( themePath )
2013-09-16 23:15:09 +04:00
theme . activate ( )
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-top " ) ) . toBe ( " 101px " )
expect ( $ ( " atom-text-editor " ) . css ( " padding-right " ) ) . toBe ( " 102px " )
expect ( $ ( " atom-text-editor " ) . css ( " padding-bottom " ) ) . toBe ( " 103px " )
2013-09-16 23:15:09 +04:00
describe " when the theme does not contain a package.json file and is a directory " , ->
it " loads all stylesheet files in the directory " , ->
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-top " ) ) . not . toBe " 10px "
expect ( $ ( " atom-text-editor " ) . css ( " padding-right " ) ) . not . toBe " 20px "
expect ( $ ( " atom-text-editor " ) . css ( " padding-bottom " ) ) . not . toBe " 30px "
2013-09-16 23:15:09 +04:00
2015-01-10 01:54:54 +03:00
themePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/theme-without-package-file ' )
2014-02-18 00:59:03 +04:00
theme = new ThemePackage ( themePath )
2013-09-16 23:15:09 +04:00
theme . activate ( )
2014-10-09 01:11:57 +04:00
expect ( $ ( " atom-text-editor " ) . css ( " padding-top " ) ) . toBe " 10px "
expect ( $ ( " atom-text-editor " ) . css ( " padding-right " ) ) . toBe " 20px "
expect ( $ ( " atom-text-editor " ) . css ( " padding-bottom " ) ) . toBe " 30px "
2013-09-16 23:15:09 +04:00
describe " reloading a theme " , ->
beforeEach ->
2015-01-10 01:54:54 +03:00
themePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/theme-with-package-file ' )
2014-02-18 00:59:03 +04:00
theme = new ThemePackage ( themePath )
2013-09-16 23:15:09 +04:00
theme . activate ( )
it " reloads without readding to the stylesheets list " , ->
expect ( theme . getStylesheetPaths ( ) . length ) . toBe 3
2014-10-16 23:16:57 +04:00
theme . reloadStylesheets ( )
2013-09-16 23:15:09 +04:00
expect ( theme . getStylesheetPaths ( ) . length ) . toBe 3
describe " events " , ->
beforeEach ->
2015-01-10 01:54:54 +03:00
themePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/theme-with-package-file ' )
2014-02-18 00:59:03 +04:00
theme = new ThemePackage ( themePath )
2013-09-16 23:15:09 +04:00
theme . activate ( )
it " deactivated event fires on .deactivate() " , ->
2014-09-10 02:09:18 +04:00
theme . onDidDeactivate spy = jasmine . createSpy ( )
2013-09-16 23:15:09 +04:00
theme . deactivate ( )
expect ( spy ) . toHaveBeenCalled ( )
2015-06-09 03:57:35 +03:00
describe " .loadMetadata() " , ->
[ packagePath , pack , metadata ] = [ ]
beforeEach ->
packagePath = atom . project . getDirectories ( ) [ 0 ] ? . resolve ( ' packages/package-with-different-directory-name ' )
metadata = Package . loadMetadata ( packagePath , true )
it " uses the package name defined in package.json " , ->
expect ( metadata . name ) . toBe ' package-with-a-totally-different-name '