Change the File Extension in Typescript – Using Path

Posted by in Software, Tutorial

Following from my previous post, I’ve updated the function to use only the path module. Now, the code looks like:

I’ve updated the workflow presented previously to: isolate the dir, ext and root components of the path replace the ext with the new extension return the normalized version of the composed path Now, our function accepts complete paths, not only filenames. Note: The path.normalize() function does NOT calculate the absolute path. It only changes the path separators. A little experiment: If you find this post and ad below useful,…read more

Change the File Extension in Typescript (or Javascript)

Posted by in Software, Tutorial

TL;DR: You need to get the root name (without the extension) and append the new extension. Then, it only depends on how tolerant you are. The other day I figured I needed a function to change the file extension (from a .jpg to a .nfo). Since I haven’t found a ready made function to do this, I decided to create my own (it’s also a good exercise for my neurons…). The function ended up having the following steps: Prerequisite: the function input parameters are the file name (not the full…read more

Consistent Testing

Posted by in Software, Tutorial

TL;DR: Delete the settings file before starting the test. Today I implemented a simple wrapper over the electron-settings functionality to gibe me access to a set of properties via get/set methods. My scenario is simple: I have a property named path.backup and I want to be able to get, set andtest it’s set`. The code is:

Now, my testing code would be something along the lines:

And I was surprised to find the test failed in the second part (can detect it has source paths). Consistently. Then, I…read more

Delete Dependent Entries of a Table in Oracle PL/SQL

Posted by in Software, Tutorial

The other day I had a task to clean up a database which was populated with a list of records. Unfortunately, my main table is linked to a host of other tables via foreign key dependencies and, to make things worse, no CASCADE constraints are specified. The process I want to is as follows: Scan main table First, we need to find the records in the main table we want removed. This is a simple SELECT statement:

In my case, the statement is:

(the 80, and 122 are…read more

Poor Man’s Mocks in TypeScript

Posted by in Software, Tutorial

Today I went against my better judgement of usign a mock framework and decided to create my own mocks to allow coverage testing for an IPC-calling code. My reference code I wanted to test is:

The code would use an angular service named PathService which, for the purpose of this test only has a method named getSourcePaths(), which returns a Promise. Now, I needed to emulate that method, and the code I wrote to do that is:

It basically defines an object containing a method getSourcePaths() which returns…read more

Use “toThrowError” and “toThrow” in TypeScript with Objects

Posted by in Software

TL;DR: wrap your method call in the expect() statement. Instead of expect(obj.method()).toThrow(), write expect( () => { obj.method() }).toThrow(). While in the process of improving the code coverage, I needed to write a test for a method throwing an exception. My initial code would have been something like:

Where SelectorComponent has a method named updateSelectors(value: any) which throws an error if the value is not in an array. If I write the test as above, it will fail (the test itself will throw the error):

However, If I…read more

Fix Angular 2 Tests with Karma

Posted by in Software

Below are some fixes I had to apply in order to make Angular 2 tests work with karma. Binding Error: Can’t bind to ‘ngModel’ since it isn’t a known property of ‘input’ Solution: Import FormsModulein your test:

Unknown component Error: ‘custom-component’ is not a known element Solution: Declare the component in your test:

Note: If the element is in another module, then import the other module (like in the previous case) instead of declaring elements one by one. Unknown <router-outlet> tag Error: ‘router-outlet’ is not a known element…read more

Initialize a Typescript Interface with JSON

Posted by in Software

TL;DR: You can initialise a typescript interface using JSON objects. On my quest to load and save objects as JSON, I found that you can convert a JSON object to an interface via something called type assertion. Basically, if you have an interface:

you can load a JSON object via JSON.parse(json) straight to an instantiation of the interface. Then, you can use the said instantiation in e.g. a component. Now, all is nice, but what if you want to initialise an instance of the PathInterface interface? That’s simple. You…read more

Angular 2
Refresh Bound Variables from Callback

Posted by in Software

TL;DR: Use ChangeDetectorRef‘s detectChanges() at the end of your callback code. While developing my electron.js app, I’ve had the following workflow: I have an input element and a button The input element is capable of editing a path The button triggers a File Open dialog

The problem I had was the showOpenDialog() accepts a callback and I couldn’t get the input field to update once the user has picked a file. Fortunately, the smart angular developers have thought of this situation too and the solution is quite simple. You…read more

Load FontAwesome Fonts with Webpack 2

Posted by in Software

TL;DR:: Add the (s)css dependency to your main (s)css file and specify where to find the fonts too. Then use the proper loaders in your webpack.config.js file. The past few days I had trouble loading the font-awesome fonts with webpack. I tried quite a few solutions: Using the font-awesome-sass-loader Manual solution webpack + font-awesome test Looking at SO (How to configure font file output directory …) and so on… Nothing seemed to work propoerly. I either had the fonts ignored or got errors of files not found. Finally, I have…read more