From d419685640eb1fe14fd300a17a134f1a0902f48a Mon Sep 17 00:00:00 2001
From: Dominik Seeger <dominik.seeger@gmx.net>
Date: Wed, 6 Mar 2019 14:48:52 +0100
Subject: [PATCH] refactor to class component, also poll available submissions
 regulary

corrected test
---
 .../subscriptions/SubscriptionList.vue        | 85 +++++++++++--------
 functional_tests/test_feedback_creation.py    |  3 +-
 2 files changed, 50 insertions(+), 38 deletions(-)

diff --git a/frontend/src/components/subscriptions/SubscriptionList.vue b/frontend/src/components/subscriptions/SubscriptionList.vue
index fcdf863c..74f4383b 100644
--- a/frontend/src/components/subscriptions/SubscriptionList.vue
+++ b/frontend/src/components/subscriptions/SubscriptionList.vue
@@ -6,7 +6,7 @@
         Tasks
       </v-toolbar-title>
       <v-spacer/>
-      <v-btn icon @click="getSubscriptions">
+      <v-btn icon @click="getSubscriptions(false)">
         <v-icon v-if="!updating">refresh</v-icon>
         <v-progress-circular
           v-else
@@ -27,54 +27,65 @@
   </v-card>
 </template>
 
-<script>
+<script lang="ts">
+import Vue from 'vue'
+import Component from 'vue-class-component'
+import { Prop } from 'vue-property-decorator'
 import { mapGetters, mapActions, mapState } from 'vuex'
 import { UI } from '@/store/modules/ui'
 import { actions } from '@/store/actions'
-import SubscriptionCreation from '@/components/subscriptions/SubscriptionCreation'
-import SubscriptionForList from '@/components/subscriptions/SubscriptionForList'
-import SubscriptionsForStage from '@/components/subscriptions/SubscriptionsForStage'
+import SubscriptionCreation from '@/components/subscriptions/SubscriptionCreation.vue'
+import SubscriptionForList from '@/components/subscriptions/SubscriptionForList.vue'
+import SubscriptionsForStage from '@/components/subscriptions/SubscriptionsForStage.vue'
 import { Subscriptions } from '@/store/modules/subscriptions'
 
-export default {
+@Component({
+  name: 'subscription-list',
   components: {
     SubscriptionsForStage,
     SubscriptionForList,
-    SubscriptionCreation },
-  name: 'subscription-list',
-  props: {
-    sidebar: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data () {
-    return {
-      selectedStage: null,
-      updating: false
-    }
+    SubscriptionCreation 
   },
-  computed: {
-    subscriptions () { return Subscriptions.state.subscriptions },
-    stages () { return Subscriptions.availableStages },
-    stagesReadable () { return Subscriptions.availableStagesReadable },
-    showDetail () {
-      return !this.sidebar || (this.sidebar && !UI.state.sideBarCollapsed)
-    }
-  },
-  methods: {
-    async getSubscriptions () {
+})
+export default class SubscriptionList extends Vue {
+  @Prop({type: Boolean, required: true, default: false}) sidebar!: boolean
+
+  selectedStage = null
+  updating = false
+  timer = 0
+
+  get subscriptions () { return Subscriptions.state.subscriptions }
+  get stages () { return Subscriptions.availableStages }
+  get stagesReadable () { return Subscriptions.availableStagesReadable }
+  get showDetail () { 
+    return !this.sidebar || (this.sidebar && !UI.state.sideBarCollapsed) 
+  }
+
+  async getSubscriptions (silent: boolean) {
+    if (silent === false) {
       this.updating = true
-      const subscriptions = await Subscriptions.getSubscriptions()
-      this.updating = false
-      return subscriptions
     }
-  },
-  created () {
-    const typesAndSubscriptions = [actions.updateSubmissionTypes(), Subscriptions.getSubscriptions()]
-    Promise.all(typesAndSubscriptions).then(() => {
+    const subscriptions = await Subscriptions.getSubscriptions()
+    this.updating = false
+    return subscriptions
+  }
+
+  mounted() {
+    this.timer = setInterval(() => {
+      this.getSubscriptions(true)
+    }, 30 * 1e3)
+  }
+
+  beforeDestroy() {
+    clearInterval(this.timer)
+  }
+
+  created() {
+    const submissionTypes = actions.updateSubmissionTypes()
+    const subscriptions = Subscriptions.getSubscriptions()
+    Promise.all([submissionTypes, subscriptions]).then(() => {
       Subscriptions.subscribeToAll()
-      Subscriptions.cleanAssignmentsFromSubscriptions()
+      Subscriptions.cleanAssignmentsFromSubscriptions(undefined)
     })
   }
 }
diff --git a/functional_tests/test_feedback_creation.py b/functional_tests/test_feedback_creation.py
index f34e2e5f..bc40155d 100644
--- a/functional_tests/test_feedback_creation.py
+++ b/functional_tests/test_feedback_creation.py
@@ -227,7 +227,8 @@ class UntestedParent:
             self.write_comments_on_lines([(0, 'I disagree'), (1, 'Full points!')])
             self.browser.find_element_by_id('score-full').click()
             self.browser.find_element_by_id('submit-feedback').click()
-            WebDriverWait(self.browser, 10).until(ec.url_contains('subscription/ended'))
+            sub_url = 'subscription/' + str(self.sub_type.pk) + '/ended'
+            WebDriverWait(self.browser, 10).until(ec.url_contains(sub_url))
             submission_for_code = Submission.objects.get(text=code)
             self.assertEqual(self.sub_type.full_score, submission_for_code.feedback.score)
             self.assertEqual(3, submission_for_code.feedback.feedback_lines.count())
-- 
GitLab