diff --git a/tests/VersionTest.php b/tests/VersionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8ceae3b595aef40570376dc264182936c836551
--- /dev/null
+++ b/tests/VersionTest.php
@@ -0,0 +1,45 @@
+<?php namespace Tests;
+use \PHPUnit_Framework_TestCase as PhpUnitTestCase;
+
+class VersionTest extends PhpUnitTestCase {
+    protected $expected_versions;
+
+    public function setup() {
+        $this->expected_versions = $this->readComposerLock();
+    }
+
+    private function readComposerLock() {
+        $lock = json_decode(file_get_contents(__DIR__.'/../composer.lock'));
+        return array_reduce($lock->packages, function ($carry, $item) {
+            $carry[str_replace('/', '-', $item->name)] = str_replace('v', '', $item->version);
+            return $carry;
+        }, []);
+    }
+
+    public function testExpander() {
+        $this->assertCorrectVersion('moodle-log-expander');
+    }
+
+    public function testTranslator() {
+        $this->assertCorrectVersion('moodle-xapi-translator');
+    }
+
+    public function testEmitter() {
+        $this->assertCorrectVersion('xapi-recipe-emitter');
+    }
+
+    private function assertCorrectVersion($repo) {
+        $actual = $this->readActualVersion($repo);
+        $expected = $this->readExpectedVersion($repo);
+        $this->assertEquals($expected, $actual);
+    }
+
+    private function readActualVersion($repo) {
+        $version = file_get_contents(__DIR__.'/../vendor/learninglocker/'.$repo.'/VERSION');
+        return str_replace("\n", "", str_replace("\r", "", $version));
+    }
+
+    private function readExpectedVersion($repo) {
+        return $this->expected_versions['learninglocker-'.$repo];
+    }
+}
\ No newline at end of file